diff --git a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/workspace/WsAgentServerUtil.java b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/workspace/WsAgentServerUtil.java new file mode 100644 index 0000000000..839340b2d8 --- /dev/null +++ b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/workspace/WsAgentServerUtil.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2012-2017 Red Hat, Inc. + * 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: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.ide.api.workspace; + +import static com.google.common.base.Strings.isNullOrEmpty; +import static org.eclipse.che.api.workspace.shared.Constants.SERVER_WS_AGENT_HTTP_REFERENCE; +import static org.eclipse.che.api.workspace.shared.Constants.SERVER_WS_AGENT_WEBSOCKET_REFERENCE; + +import com.google.common.annotations.VisibleForTesting; +import java.util.Optional; +import javax.inject.Inject; +import javax.inject.Singleton; +import org.eclipse.che.api.workspace.shared.Constants; +import org.eclipse.che.ide.QueryParameters; +import org.eclipse.che.ide.api.app.AppContext; +import org.eclipse.che.ide.api.workspace.model.MachineImpl; +import org.eclipse.che.ide.api.workspace.model.RuntimeImpl; +import org.eclipse.che.ide.api.workspace.model.ServerImpl; +import org.eclipse.che.ide.api.workspace.model.WorkspaceImpl; + +/** Helps to quickly get info related to the "wsagent" server. */ +@Singleton +public class WsAgentServerUtil { + + /** + * URL's query parameter for passing the prefix of the "wsagent" server reference. Allows to tell + * IDE to use a different "wsagent" server. + */ + public static final String WSAGENT_SERVER_REF_PREFIX_PARAM = "wsagent-ref-prefix"; + + private final AppContext appContext; + private final QueryParameters queryParameters; + + @Inject + public WsAgentServerUtil(AppContext appContext, QueryParameters queryParameters) { + this.appContext = appContext; + this.queryParameters = queryParameters; + } + + /** + * Returns {@code Optional} with a machine which contains the "wsagent" server. + * + * @return {@code Optional} with the machine which contains the "wsagent" server if the current + * workspace has a runtime and there is such machine, otherwise an empty {@code Optional} + */ + public Optional getWsAgentServerMachine() { + return getWorkspaceRuntime() + .flatMap( + runtime -> + runtime + .getMachines() + .values() + .stream() + .filter(this::containsWsAgentHttpServer) + .findAny()); + } + + /** + * Returns {@code Optional} with the {@link Constants#SERVER_WS_AGENT_HTTP_REFERENCE wsagent/http} + * server. + * + * @return {@code Optional} with the {@link Constants#SERVER_WS_AGENT_HTTP_REFERENCE wsagent/http} + * server if the current workspace has a runtime and there is a machine with such server, + * otherwise an empty {@code Optional} + */ + public Optional getWsAgentHttpServer() { + return getServerByRef(getWsAgentHttpServerReference()); + } + + /** + * Returns {@code Optional} with the {@link Constants#SERVER_WS_AGENT_WEBSOCKET_REFERENCE + * wsagent/ws} server. + * + * @return {@code Optional} with the {@link Constants#SERVER_WS_AGENT_WEBSOCKET_REFERENCE + * wsagent/ws} server if the current workspace has a runtime and there is a machine with such + * server, otherwise an empty {@code Optional} + */ + public Optional getWsAgentWebSocketServer() { + return getServerByRef(getWsAgentWebSocketServerReference()); + } + + @VisibleForTesting + Optional getServerByRef(String ref) { + Optional runtimeOpt = getWorkspaceRuntime(); + + if (runtimeOpt.isPresent()) { + for (MachineImpl machine : runtimeOpt.get().getMachines().values()) { + ServerImpl server = machine.getServers().get(ref); + + if (server != null) { + return Optional.of(server); + } + } + } + + return Optional.empty(); + } + + /** + * Checks whether the provided {@link MachineImpl} contains the {@link + * Constants#SERVER_WS_AGENT_HTTP_REFERENCE wsagent/http} server. + * + * @param machine {@link MachineImpl} to check + * @return {@code true} if the given machine contains the {@link + * Constants#SERVER_WS_AGENT_HTTP_REFERENCE wsagent/http} server server, otherwise {@code + * false} + */ + public boolean containsWsAgentHttpServer(MachineImpl machine) { + return machine.getServers().keySet().contains(getWsAgentHttpServerReference()); + } + + /** + * Returns a reference of the {@link Constants#SERVER_WS_AGENT_HTTP_REFERENCE wsagent/http} + * server. + * + *

Note, the returned server reference may be prepended with the prefix passed + * through the URL's query parameter. + * + * @see #WSAGENT_SERVER_REF_PREFIX_PARAM + */ + public String getWsAgentHttpServerReference() { + String refPrefix = queryParameters.getByName(WSAGENT_SERVER_REF_PREFIX_PARAM); + + return isNullOrEmpty(refPrefix) + ? SERVER_WS_AGENT_HTTP_REFERENCE + : refPrefix + SERVER_WS_AGENT_HTTP_REFERENCE; + } + + /** + * Returns a reference of the {@link Constants#SERVER_WS_AGENT_WEBSOCKET_REFERENCE wsagent/ws} + * server. + * + *

Note, the returned server reference may be prepended with the prefix passed + * through the URL's query parameter. + * + * @see #WSAGENT_SERVER_REF_PREFIX_PARAM + */ + public String getWsAgentWebSocketServerReference() { + String refPrefix = queryParameters.getByName(WSAGENT_SERVER_REF_PREFIX_PARAM); + + return isNullOrEmpty(refPrefix) + ? SERVER_WS_AGENT_WEBSOCKET_REFERENCE + : refPrefix + SERVER_WS_AGENT_WEBSOCKET_REFERENCE; + } + + @VisibleForTesting + Optional getWorkspaceRuntime() { + WorkspaceImpl workspace = appContext.getWorkspace(); + + return Optional.ofNullable(workspace.getRuntime()); + } +} diff --git a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/workspace/model/RuntimeImpl.java b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/workspace/model/RuntimeImpl.java index 2790e590e8..1b8e878f0f 100644 --- a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/workspace/model/RuntimeImpl.java +++ b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/workspace/model/RuntimeImpl.java @@ -12,7 +12,6 @@ package org.eclipse.che.ide.api.workspace.model; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; -import static org.eclipse.che.api.workspace.shared.Constants.SERVER_WS_AGENT_HTTP_REFERENCE; import java.util.ArrayList; import java.util.HashMap; @@ -74,18 +73,6 @@ public class RuntimeImpl implements Runtime { return machines; } - /** - * Returns a dev-machine or an empty {@code Optional} if none. Dev-machine is a machine where - * ws-agent server is running. - */ - public Optional getDevMachine() { - return getMachines() - .values() - .stream() - .filter(m -> m.getServerByName(SERVER_WS_AGENT_HTTP_REFERENCE).isPresent()) - .findAny(); - } - public Optional getMachineByName(String name) { return Optional.ofNullable(getMachines().get(name)); } diff --git a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/workspace/model/WorkspaceImpl.java b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/workspace/model/WorkspaceImpl.java index a417f2bdc1..ea369387ad 100644 --- a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/workspace/model/WorkspaceImpl.java +++ b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/workspace/model/WorkspaceImpl.java @@ -13,7 +13,6 @@ package org.eclipse.che.ide.api.workspace.model; import java.util.HashMap; import java.util.Map; import java.util.Objects; -import java.util.Optional; import org.eclipse.che.api.core.model.workspace.Workspace; import org.eclipse.che.api.core.model.workspace.WorkspaceConfig; import org.eclipse.che.api.core.model.workspace.WorkspaceStatus; @@ -169,16 +168,6 @@ public class WorkspaceImpl implements Workspace { return runtime; } - /** - * Shorthand for {@link RuntimeImpl#getDevMachine()}. Allows to avoid checking whether runtime is - * exists or not. Returns an empty {@code Optional} if workspace doesn't have a runtime. - * - * @see RuntimeImpl#getDevMachine() - */ - public Optional getDevMachine() { - return getRuntime() != null ? getRuntime().getDevMachine() : Optional.empty(); - } - @Override public boolean equals(Object obj) { if (this == obj) return true; diff --git a/ide/che-core-ide-api/src/test/java/org/eclipse/che/ide/api/workspace/WsAgentServerUtilTest.java b/ide/che-core-ide-api/src/test/java/org/eclipse/che/ide/api/workspace/WsAgentServerUtilTest.java new file mode 100644 index 0000000000..8d7d04e13b --- /dev/null +++ b/ide/che-core-ide-api/src/test/java/org/eclipse/che/ide/api/workspace/WsAgentServerUtilTest.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2012-2017 Red Hat, Inc. + * 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: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.ide.api.workspace; + +import static java.util.Collections.singletonMap; +import static org.eclipse.che.api.workspace.shared.Constants.SERVER_WS_AGENT_HTTP_REFERENCE; +import static org.eclipse.che.api.workspace.shared.Constants.SERVER_WS_AGENT_WEBSOCKET_REFERENCE; +import static org.eclipse.che.ide.api.workspace.WsAgentServerUtil.WSAGENT_SERVER_REF_PREFIX_PARAM; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import org.eclipse.che.ide.QueryParameters; +import org.eclipse.che.ide.api.app.AppContext; +import org.eclipse.che.ide.api.workspace.model.MachineImpl; +import org.eclipse.che.ide.api.workspace.model.RuntimeImpl; +import org.eclipse.che.ide.api.workspace.model.ServerImpl; +import org.eclipse.che.ide.api.workspace.model.WorkspaceImpl; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +/** Tests for the {@link WsAgentServerUtil}. */ +@RunWith(MockitoJUnitRunner.class) +public class WsAgentServerUtilTest { + + static final String REF_PREFIX = "dev-"; + + @Mock AppContext appContext; + @Mock QueryParameters queryParameters; + + @Mock RuntimeImpl runtime; + @Mock WorkspaceImpl workspace; + @Mock MachineImpl machine; + @Mock ServerImpl serverWsAgentHTTP; + @Mock ServerImpl serverWsAgentWebSocket; + + @InjectMocks WsAgentServerUtil util; + + @Test + public void shouldReturnWsAgentServerMachine() throws Exception { + mockRuntime(); + + Optional machineOpt = util.getWsAgentServerMachine(); + + assertTrue(machineOpt.isPresent()); + assertEquals(machine, machineOpt.get()); + } + + @Test + public void shouldReturnServerByRef() throws Exception { + mockRuntime(); + + Optional serverOpt = util.getServerByRef(SERVER_WS_AGENT_HTTP_REFERENCE); + + assertTrue(serverOpt.isPresent()); + assertEquals(serverWsAgentHTTP, serverOpt.get()); + } + + @Test + public void shouldNotReturnServerByWrongRef() throws Exception { + mockRuntime(); + + Optional serverOpt = util.getServerByRef("wrong-ref"); + + assertFalse(serverOpt.isPresent()); + } + + @Test + public void shouldReturnWsAgentHttpServerReferenceWithPrefix() throws Exception { + when(queryParameters.getByName(WSAGENT_SERVER_REF_PREFIX_PARAM)).thenReturn(REF_PREFIX); + + String serverRef = util.getWsAgentHttpServerReference(); + + verify(queryParameters).getByName(WSAGENT_SERVER_REF_PREFIX_PARAM); + assertEquals(REF_PREFIX + SERVER_WS_AGENT_HTTP_REFERENCE, serverRef); + } + + @Test + public void shouldReturnWsAgentHttpServerReferenceWithoutPrefix() throws Exception { + when(queryParameters.getByName(WSAGENT_SERVER_REF_PREFIX_PARAM)).thenReturn(""); + + String serverRef = util.getWsAgentHttpServerReference(); + + verify(queryParameters).getByName(WSAGENT_SERVER_REF_PREFIX_PARAM); + assertEquals(SERVER_WS_AGENT_HTTP_REFERENCE, serverRef); + } + + @Test + public void shouldReturnWsAgentWebSocketServerReferenceWithPrefix() throws Exception { + when(queryParameters.getByName(WSAGENT_SERVER_REF_PREFIX_PARAM)).thenReturn(REF_PREFIX); + + String serverRef = util.getWsAgentWebSocketServerReference(); + + verify(queryParameters).getByName(WSAGENT_SERVER_REF_PREFIX_PARAM); + assertEquals(REF_PREFIX + SERVER_WS_AGENT_WEBSOCKET_REFERENCE, serverRef); + } + + @Test + public void shouldReturnWsAgentWebSocketServerReferenceWithoutPrefix() throws Exception { + when(queryParameters.getByName(WSAGENT_SERVER_REF_PREFIX_PARAM)).thenReturn(""); + + String serverRef = util.getWsAgentWebSocketServerReference(); + + verify(queryParameters).getByName(WSAGENT_SERVER_REF_PREFIX_PARAM); + assertEquals(SERVER_WS_AGENT_WEBSOCKET_REFERENCE, serverRef); + } + + @Test + public void shouldReturnWorkspaceRuntime() throws Exception { + mockRuntime(); + + Optional runtimeOpt = util.getWorkspaceRuntime(); + + assertTrue(runtimeOpt.isPresent()); + assertEquals(runtime, runtimeOpt.get()); + } + + private void mockRuntime() { + Map servers = new HashMap<>(); + servers.put(SERVER_WS_AGENT_HTTP_REFERENCE, serverWsAgentHTTP); + servers.put(SERVER_WS_AGENT_WEBSOCKET_REFERENCE, serverWsAgentWebSocket); + + when(appContext.getWorkspace()).thenReturn(workspace); + when(workspace.getRuntime()).thenReturn(runtime); + when(runtime.getMachines()).thenReturn(singletonMap("dev-machine", machine)); + when(machine.getServers()).thenReturn(servers); + } +} diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/actions/RunCommandAction.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/actions/RunCommandAction.java index 414c0526d6..36ace71b52 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/actions/RunCommandAction.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/actions/RunCommandAction.java @@ -14,10 +14,9 @@ import com.google.inject.Inject; import org.eclipse.che.ide.CoreLocalizationConstant; import org.eclipse.che.ide.api.action.ActionEvent; import org.eclipse.che.ide.api.action.BaseAction; -import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.command.CommandExecutor; import org.eclipse.che.ide.api.command.CommandManager; -import org.eclipse.che.ide.api.workspace.model.WorkspaceImpl; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.util.loging.Log; /** @@ -31,7 +30,7 @@ public class RunCommandAction extends BaseAction { private final CommandManager commandManager; private final CommandExecutor commandExecutor; - private final AppContext appContext; + private final WsAgentServerUtil wsAgentServerUtil; private final CoreLocalizationConstant localizationConstant; @Inject @@ -39,11 +38,11 @@ public class RunCommandAction extends BaseAction { CommandManager commandManager, CoreLocalizationConstant localizationConstant, CommandExecutor commandExecutor, - AppContext appContext) { + WsAgentServerUtil wsAgentServerUtil) { this.commandManager = commandManager; this.localizationConstant = localizationConstant; this.commandExecutor = commandExecutor; - this.appContext = appContext; + this.wsAgentServerUtil = wsAgentServerUtil; } @Override @@ -59,9 +58,8 @@ public class RunCommandAction extends BaseAction { return; } - final WorkspaceImpl workspace = appContext.getWorkspace(); - workspace - .getDevMachine() + wsAgentServerUtil + .getWsAgentServerMachine() .ifPresent( m -> commandManager diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/bootstrap/FactoryIdeInitializationStrategy.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/bootstrap/FactoryIdeInitializationStrategy.java index 6ad83a62d1..8d7cfe0d1d 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/bootstrap/FactoryIdeInitializationStrategy.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/bootstrap/FactoryIdeInitializationStrategy.java @@ -24,13 +24,13 @@ import org.eclipse.che.api.promises.client.Operation; import org.eclipse.che.api.promises.client.OperationException; import org.eclipse.che.api.promises.client.Promise; import org.eclipse.che.api.promises.client.PromiseError; +import org.eclipse.che.ide.QueryParameters; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.factory.FactoryServiceClient; import org.eclipse.che.ide.api.theme.ThemeAgent; import org.eclipse.che.ide.api.workspace.model.WorkspaceImpl; import org.eclipse.che.ide.context.AppContextImpl; import org.eclipse.che.ide.context.BrowserAddress; -import org.eclipse.che.ide.context.QueryParameters; import org.eclipse.che.ide.core.StandardComponentInitializer; import org.eclipse.che.ide.preferences.StyleInjector; import org.eclipse.che.ide.statepersistance.AppStateManager; diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/bootstrap/IdeInitializationStrategyProvider.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/bootstrap/IdeInitializationStrategyProvider.java index 29cabc883b..ad68fd6d49 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/bootstrap/IdeInitializationStrategyProvider.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/bootstrap/IdeInitializationStrategyProvider.java @@ -13,7 +13,7 @@ package org.eclipse.che.ide.bootstrap; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; -import org.eclipse.che.ide.context.QueryParameters; +import org.eclipse.che.ide.QueryParameters; /** * Provides {@link IdeInitializationStrategy} depending on the loading mode (default or factory). diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/command/toolbar/previews/PreviewUrl.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/command/toolbar/previews/PreviewUrl.java index 6d1d8d8e72..1268aa25ca 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/command/toolbar/previews/PreviewUrl.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/command/toolbar/previews/PreviewUrl.java @@ -14,22 +14,20 @@ import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; import org.eclipse.che.api.core.model.workspace.runtime.Server; -import org.eclipse.che.ide.api.app.AppContext; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.model.MachineImpl; -import org.eclipse.che.ide.api.workspace.model.WorkspaceImpl; /** Represents an item for displaying in the 'Previews' list. */ class PreviewUrl { - private final AppContext appContext; - private final String url; private final String displayName; + private final WsAgentServerUtil wsAgentServerUtil; - PreviewUrl(String url, AppContext appContext) { + PreviewUrl(String url, WsAgentServerUtil wsAgentServerUtil) { this.url = url; - this.appContext = appContext; this.displayName = getDisplayNameForPreviewUrl(url); + this.wsAgentServerUtil = wsAgentServerUtil; } /** Returns actual preview URL. */ @@ -46,8 +44,7 @@ class PreviewUrl { } private String getDisplayNameForPreviewUrl(String previewUrl) { - final WorkspaceImpl workspace = appContext.getWorkspace(); - final Optional devMachine = workspace.getDevMachine(); + final Optional devMachine = wsAgentServerUtil.getWsAgentServerMachine(); if (!devMachine.isPresent()) { return previewUrl; diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/command/toolbar/previews/PreviewsViewImpl.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/command/toolbar/previews/PreviewsViewImpl.java index 822fb45d1d..c5b455f7bd 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/command/toolbar/previews/PreviewsViewImpl.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/command/toolbar/previews/PreviewsViewImpl.java @@ -20,7 +20,7 @@ import com.google.inject.Singleton; import elemental.dom.Element; import java.util.HashMap; import java.util.Map; -import org.eclipse.che.ide.api.app.AppContext; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.command.toolbar.ToolbarMessages; import org.eclipse.che.ide.ui.Tooltip; import org.eclipse.che.ide.ui.dropdown.BaseListItem; @@ -38,14 +38,14 @@ public class PreviewsViewImpl implements PreviewsView { private final NoPreviewsItem noPreviewsItem; private final NoPreviewsItemRenderer noPreviewsItemRenderer; private final ToolbarMessages messages; - private final AppContext appContext; + private final WsAgentServerUtil wsAgentServerUtil; private ActionDelegate delegate; @Inject - public PreviewsViewImpl(ToolbarMessages messages, AppContext appContext) { + public PreviewsViewImpl(ToolbarMessages messages, WsAgentServerUtil wsAgentServerUtil) { this.messages = messages; - this.appContext = appContext; + this.wsAgentServerUtil = wsAgentServerUtil; listItems = new HashMap<>(); @@ -93,7 +93,7 @@ public class PreviewsViewImpl implements PreviewsView { return; } - final PreviewUrl displayablePreviewUrl = new PreviewUrl(previewUrl, appContext); + final PreviewUrl displayablePreviewUrl = new PreviewUrl(previewUrl, wsAgentServerUtil); final BaseListItem listItem = new BaseListItem<>(displayablePreviewUrl); final PreviewUrlItemRenderer renderer = new PreviewUrlItemRenderer(listItem); diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/context/AppContextImpl.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/context/AppContextImpl.java index f7ea30fd2e..9d72e930b6 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/context/AppContextImpl.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/context/AppContextImpl.java @@ -13,7 +13,6 @@ package org.eclipse.che.ide.context; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Lists.newArrayList; import static java.util.Collections.addAll; -import static org.eclipse.che.api.workspace.shared.Constants.SERVER_WS_AGENT_HTTP_REFERENCE; import static org.eclipse.che.ide.api.resources.ResourceDelta.ADDED; import static org.eclipse.che.ide.api.resources.ResourceDelta.MOVED_FROM; import static org.eclipse.che.ide.api.resources.ResourceDelta.MOVED_TO; @@ -52,10 +51,9 @@ import org.eclipse.che.ide.api.selection.Selection; import org.eclipse.che.ide.api.selection.SelectionChangedEvent; import org.eclipse.che.ide.api.selection.SelectionChangedHandler; import org.eclipse.che.ide.api.workspace.WorkspaceReadyEvent; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.event.WorkspaceStoppedEvent; import org.eclipse.che.ide.api.workspace.event.WorkspaceStoppingEvent; -import org.eclipse.che.ide.api.workspace.model.MachineImpl; -import org.eclipse.che.ide.api.workspace.model.RuntimeImpl; import org.eclipse.che.ide.api.workspace.model.ServerImpl; import org.eclipse.che.ide.api.workspace.model.WorkspaceImpl; import org.eclipse.che.ide.project.node.SyntheticNode; @@ -82,6 +80,7 @@ public class AppContextImpl implements AppContext, SelectionChangedHandler, Reso private final ResourceManager.ResourceManagerFactory resourceManagerFactory; private final Provider editorAgentProvider; private final Provider appStateManager; + private final Provider wsAgentServerUtilProvider; private final List rootProjects = newArrayList(); private final List selectedResources = newArrayList(); @@ -107,11 +106,13 @@ public class AppContextImpl implements AppContext, SelectionChangedHandler, Reso EventBus eventBus, ResourceManager.ResourceManagerFactory resourceManagerFactory, Provider editorAgentProvider, - Provider appStateManager) { + Provider appStateManager, + Provider wsAgentServerUtilProvider) { this.eventBus = eventBus; this.resourceManagerFactory = resourceManagerFactory; this.editorAgentProvider = editorAgentProvider; this.appStateManager = appStateManager; + this.wsAgentServerUtilProvider = wsAgentServerUtilProvider; this.startAppActions = new ArrayList<>(); projectsInImport = new ArrayList<>(); @@ -423,19 +424,13 @@ public class AppContextImpl implements AppContext, SelectionChangedHandler, Reso @Override public String getWsAgentServerApiEndpoint() { - RuntimeImpl runtime = getWorkspace().getRuntime(); - Optional devMachine = runtime.getDevMachine(); + Optional server = wsAgentServerUtilProvider.get().getWsAgentHttpServer(); - if (devMachine.isPresent()) { - Optional wsAgentServer = - devMachine.get().getServerByName(SERVER_WS_AGENT_HTTP_REFERENCE); - - if (wsAgentServer.isPresent()) { - return wsAgentServer.get().getUrl(); - } + if (server.isPresent()) { + return server.get().getUrl(); } - throw new RuntimeException("ws-agent server doesn't exist"); + throw new RuntimeException("wsagent server doesn't exist"); } @Override diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/jsonrpc/WsAgentJsonRpcInitializer.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/jsonrpc/WsAgentJsonRpcInitializer.java index 6f564a60d6..43a3fa2bca 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/jsonrpc/WsAgentJsonRpcInitializer.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/jsonrpc/WsAgentJsonRpcInitializer.java @@ -14,16 +14,17 @@ import static java.util.Collections.emptySet; import static java.util.Collections.singleton; import static java.util.Collections.singletonMap; import static org.eclipse.che.api.core.model.workspace.WorkspaceStatus.RUNNING; -import static org.eclipse.che.api.workspace.shared.Constants.SERVER_WS_AGENT_WEBSOCKET_REFERENCE; import static org.eclipse.che.ide.api.jsonrpc.Constants.WS_AGENT_JSON_RPC_ENDPOINT_ID; import com.google.gwt.user.client.Timer; import com.google.inject.Inject; import com.google.web.bindery.event.shared.EventBus; +import java.util.Optional; import java.util.Set; import javax.inject.Singleton; import org.eclipse.che.api.core.jsonrpc.commons.RequestTransmitter; import org.eclipse.che.ide.api.app.AppContext; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.event.WsAgentServerRunningEvent; import org.eclipse.che.ide.api.workspace.event.WsAgentServerStoppedEvent; import org.eclipse.che.ide.api.workspace.model.RuntimeImpl; @@ -40,6 +41,7 @@ public class WsAgentJsonRpcInitializer { private final JsonRpcInitializer initializer; private final RequestTransmitter requestTransmitter; private final AgentURLModifier agentURLModifier; + private final WsAgentServerUtil wsAgentServerUtil; @Inject public WsAgentJsonRpcInitializer( @@ -47,11 +49,13 @@ public class WsAgentJsonRpcInitializer { AppContext appContext, EventBus eventBus, RequestTransmitter requestTransmitter, - AgentURLModifier agentURLModifier) { + AgentURLModifier agentURLModifier, + WsAgentServerUtil wsAgentServerUtil) { this.appContext = appContext; this.initializer = initializer; this.requestTransmitter = requestTransmitter; this.agentURLModifier = agentURLModifier; + this.wsAgentServerUtil = wsAgentServerUtil; eventBus.addHandler(WsAgentServerRunningEvent.TYPE, event -> initializeJsonRpcService()); eventBus.addHandler( @@ -93,31 +97,22 @@ public class WsAgentJsonRpcInitializer { return; // workspace is stopped } - runtime - .getDevMachine() + wsAgentServerUtil + .getWsAgentWebSocketServer() .ifPresent( - devMachine -> { - devMachine - .getServerByName(SERVER_WS_AGENT_WEBSOCKET_REFERENCE) - .ifPresent( - server -> { - String wsAgentWebSocketUrl = agentURLModifier.modify(server.getUrl()); - String separator = wsAgentWebSocketUrl.contains("?") ? "&" : "?"; - String queryParams = - appContext - .getApplicationWebsocketId() - .map(id -> separator + "clientId=" + id) - .orElse(""); - Set initActions = - appContext.getApplicationWebsocketId().isPresent() - ? emptySet() - : singleton(this::processWsId); + server -> { + String wsAgentWebSocketUrl = agentURLModifier.modify(server.getUrl()); + String separator = wsAgentWebSocketUrl.contains("?") ? "&" : "?"; + Optional applicationWebSocketId = appContext.getApplicationWebsocketId(); + String queryParams = + applicationWebSocketId.map(id -> separator + "clientId=" + id).orElse(""); + Set initActions = + applicationWebSocketId.isPresent() ? emptySet() : singleton(this::processWsId); - initializer.initialize( - WS_AGENT_JSON_RPC_ENDPOINT_ID, - singletonMap("url", wsAgentWebSocketUrl + queryParams), - initActions); - }); + initializer.initialize( + WS_AGENT_JSON_RPC_ENDPOINT_ID, + singletonMap("url", wsAgentWebSocketUrl + queryParams), + initActions); }); } diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/jsonrpc/WsMasterJsonRpcInitializer.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/jsonrpc/WsMasterJsonRpcInitializer.java index 2a1c2c266c..41409eae32 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/jsonrpc/WsMasterJsonRpcInitializer.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/jsonrpc/WsMasterJsonRpcInitializer.java @@ -20,7 +20,6 @@ import static org.eclipse.che.api.workspace.shared.Constants.MACHINE_STATUS_CHAN import static org.eclipse.che.api.workspace.shared.Constants.SERVER_EXEC_AGENT_HTTP_REFERENCE; import static org.eclipse.che.api.workspace.shared.Constants.SERVER_STATUS_CHANGED_METHOD; import static org.eclipse.che.api.workspace.shared.Constants.SERVER_TERMINAL_REFERENCE; -import static org.eclipse.che.api.workspace.shared.Constants.SERVER_WS_AGENT_HTTP_REFERENCE; import static org.eclipse.che.api.workspace.shared.Constants.WORKSPACE_STATUS_CHANGED_METHOD; import static org.eclipse.che.ide.api.jsonrpc.Constants.WS_MASTER_JSON_RPC_ENDPOINT_ID; @@ -35,6 +34,7 @@ import org.eclipse.che.api.core.jsonrpc.commons.RequestTransmitter; import org.eclipse.che.api.core.model.workspace.WorkspaceStatus; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.jsonrpc.SubscriptionManagerClient; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.event.ExecAgentServerRunningEvent; import org.eclipse.che.ide.api.workspace.event.ServerRunningEvent; import org.eclipse.che.ide.api.workspace.event.TerminalAgentServerRunningEvent; @@ -61,6 +61,7 @@ public class WsMasterJsonRpcInitializer { private final SubscriptionManagerClient subscriptionManagerClient; private final WorkspaceServiceClient workspaceServiceClient; private final SecurityTokenProvider securityTokenProvider; + private final WsAgentServerUtil wsAgentServerUtil; @Inject public WsMasterJsonRpcInitializer( @@ -70,7 +71,8 @@ public class WsMasterJsonRpcInitializer { EventBus eventBus, SubscriptionManagerClient subscriptionManagerClient, WorkspaceServiceClient workspaceServiceClient, - SecurityTokenProvider securityTokenProvider) { + SecurityTokenProvider securityTokenProvider, + WsAgentServerUtil wsAgentServerUtil) { this.initializer = initializer; this.requestTransmitter = requestTransmitter; this.appContext = appContext; @@ -78,6 +80,7 @@ public class WsMasterJsonRpcInitializer { this.subscriptionManagerClient = subscriptionManagerClient; this.workspaceServiceClient = workspaceServiceClient; this.securityTokenProvider = securityTokenProvider; + this.wsAgentServerUtil = wsAgentServerUtil; eventBus.addHandler(BasicIDEInitializedEvent.TYPE, e -> initialize()); eventBus.addHandler(WorkspaceStartingEvent.TYPE, e -> initialize()); @@ -211,8 +214,9 @@ public class WsMasterJsonRpcInitializer { if (server.getStatus() == RUNNING) { eventBus.fireEvent(new ServerRunningEvent(server.getName(), machine.getName())); + String wsAgentHttpServerRef = wsAgentServerUtil.getWsAgentHttpServerReference(); // fire events for the often used servers - if (SERVER_WS_AGENT_HTTP_REFERENCE.equals(server.getName())) { + if (wsAgentHttpServerRef.equals(server.getName())) { eventBus.fireEvent(new WsAgentServerRunningEvent(machine.getName())); } else if (SERVER_TERMINAL_REFERENCE.equals(server.getName())) { eventBus.fireEvent(new TerminalAgentServerRunningEvent(machine.getName())); diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/macro/DevMachineHostNameMacro.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/macro/DevMachineHostNameMacro.java index 94d26d0fe3..4113288f06 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/macro/DevMachineHostNameMacro.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/macro/DevMachineHostNameMacro.java @@ -17,10 +17,9 @@ import javax.validation.constraints.NotNull; import org.eclipse.che.api.promises.client.Promise; import org.eclipse.che.api.promises.client.js.Promises; import org.eclipse.che.ide.CoreLocalizationConstant; -import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.macro.Macro; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.model.MachineImpl; -import org.eclipse.che.ide.api.workspace.model.WorkspaceImpl; /** * Provides dev-machine's host name. @@ -32,14 +31,14 @@ public class DevMachineHostNameMacro implements Macro { private static final String KEY = "${machine.dev.hostname}"; - private final AppContext appContext; private final CoreLocalizationConstant localizationConstants; + private final WsAgentServerUtil wsAgentServerUtil; @Inject public DevMachineHostNameMacro( - AppContext appContext, CoreLocalizationConstant localizationConstants) { - this.appContext = appContext; + CoreLocalizationConstant localizationConstants, WsAgentServerUtil wsAgentServerUtil) { this.localizationConstants = localizationConstants; + this.wsAgentServerUtil = wsAgentServerUtil; } @NotNull @@ -58,8 +57,7 @@ public class DevMachineHostNameMacro implements Macro { public Promise expand() { String value = ""; - WorkspaceImpl workspace = appContext.getWorkspace(); - Optional devMachine = workspace.getDevMachine(); + Optional devMachine = wsAgentServerUtil.getWsAgentServerMachine(); if (devMachine.isPresent()) { String hostName = devMachine.get().getProperties().get("config.hostname"); diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/macro/ServerAddressMacroRegistrar.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/macro/ServerAddressMacroRegistrar.java index c3b43afa4f..403b3c25c0 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/macro/ServerAddressMacroRegistrar.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/macro/ServerAddressMacroRegistrar.java @@ -26,10 +26,10 @@ import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.macro.BaseMacro; import org.eclipse.che.ide.api.macro.Macro; import org.eclipse.che.ide.api.macro.MacroRegistry; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.event.WorkspaceRunningEvent; import org.eclipse.che.ide.api.workspace.event.WorkspaceStoppedEvent; import org.eclipse.che.ide.api.workspace.model.MachineImpl; -import org.eclipse.che.ide.api.workspace.model.WorkspaceImpl; import org.eclipse.che.ide.bootstrap.BasicIDEInitializedEvent; /** @@ -46,14 +46,19 @@ public class ServerAddressMacroRegistrar { private final Provider macroRegistryProvider; private final AppContext appContext; + private final WsAgentServerUtil wsAgentServerUtil; private Set macros; @Inject public ServerAddressMacroRegistrar( - EventBus eventBus, Provider macroRegistryProvider, AppContext appContext) { + EventBus eventBus, + Provider macroRegistryProvider, + AppContext appContext, + WsAgentServerUtil wsAgentServerUtil) { this.macroRegistryProvider = macroRegistryProvider; this.appContext = appContext; + this.wsAgentServerUtil = wsAgentServerUtil; eventBus.addHandler( BasicIDEInitializedEvent.TYPE, @@ -74,8 +79,7 @@ public class ServerAddressMacroRegistrar { } private void registerMacros() { - final WorkspaceImpl workspace = appContext.getWorkspace(); - final Optional devMachine = workspace.getDevMachine(); + final Optional devMachine = wsAgentServerUtil.getWsAgentServerMachine(); if (devMachine.isPresent()) { macros = getMacros(devMachine.get()); diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/panel/ProcessesPanelPresenter.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/panel/ProcessesPanelPresenter.java index b3b6984fe7..5860b8c702 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/panel/ProcessesPanelPresenter.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/processes/panel/ProcessesPanelPresenter.java @@ -16,7 +16,6 @@ import static java.util.Collections.emptyList; import static org.eclipse.che.api.core.model.workspace.WorkspaceStatus.RUNNING; import static org.eclipse.che.api.workspace.shared.Constants.SERVER_SSH_REFERENCE; import static org.eclipse.che.api.workspace.shared.Constants.SERVER_TERMINAL_REFERENCE; -import static org.eclipse.che.api.workspace.shared.Constants.SERVER_WS_AGENT_HTTP_REFERENCE; import static org.eclipse.che.ide.api.notification.StatusNotification.DisplayMode.FLOAT_MODE; import static org.eclipse.che.ide.api.notification.StatusNotification.Status.FAIL; import static org.eclipse.che.ide.processes.ProcessTreeNode.ProcessNodeType.COMMAND_NODE; @@ -72,6 +71,7 @@ import org.eclipse.che.ide.api.parts.WorkspaceAgent; import org.eclipse.che.ide.api.parts.base.BasePresenter; import org.eclipse.che.ide.api.selection.Selection; import org.eclipse.che.ide.api.ssh.SshServiceClient; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.event.ExecAgentServerRunningEvent; import org.eclipse.che.ide.api.workspace.event.MachineRunningEvent; import org.eclipse.che.ide.api.workspace.event.MachineStartingEvent; @@ -154,6 +154,7 @@ public class ProcessesPanelPresenter extends BasePresenter private final RuntimeInfoWidgetFactory runtimeInfoWidgetFactory; private final RuntimeInfoProvider runtimeInfoProvider; private final RuntimeInfoLocalization runtimeInfoLocalization; + private final WsAgentServerUtil wsAgentServerUtil; private final EventBus eventBus; private final Map machineNodes; ProcessTreeNode rootNode; @@ -182,7 +183,8 @@ public class ProcessesPanelPresenter extends BasePresenter RuntimeInfoWidgetFactory runtimeInfoWidgetFactory, RuntimeInfoProvider runtimeInfoProvider, RuntimeInfoLocalization runtimeInfoLocalization, - Provider workspaceLoadingTrackerProvider) { + Provider workspaceLoadingTrackerProvider, + WsAgentServerUtil wsAgentServerUtil) { this.view = view; this.localizationConstant = localizationConstant; this.resources = resources; @@ -203,6 +205,7 @@ public class ProcessesPanelPresenter extends BasePresenter this.runtimeInfoWidgetFactory = runtimeInfoWidgetFactory; this.runtimeInfoProvider = runtimeInfoProvider; this.runtimeInfoLocalization = runtimeInfoLocalization; + this.wsAgentServerUtil = wsAgentServerUtil; machineNodes = new HashMap<>(); machines = new HashMap<>(); @@ -244,13 +247,13 @@ public class ProcessesPanelPresenter extends BasePresenter return; } - for (MachineImpl machine : machines) { - if (machine.getServerByName(SERVER_WS_AGENT_HTTP_REFERENCE).isPresent()) { - provideMachineNode(machine.getName(), true); - machines.remove(machine); - break; - } - } + Optional wsAgentServerMachine = wsAgentServerUtil.getWsAgentServerMachine(); + + wsAgentServerMachine.ifPresent( + machine -> { + provideMachineNode(machine.getName(), true); + machines.remove(machine); + }); for (MachineImpl machine : machines) { provideMachineNode(machine.getName(), true); @@ -333,8 +336,7 @@ public class ProcessesPanelPresenter extends BasePresenter public void newTerminal(TerminalOptionsJso options) { final ProcessTreeNode selectedTreeNode = view.getSelectedTreeNode(); - final WorkspaceImpl workspace = appContext.getWorkspace(); - final Optional devMachine = workspace.getDevMachine(); + final Optional devMachine = wsAgentServerUtil.getWsAgentServerMachine(); if (selectedTreeNode == null && devMachine.isPresent()) { onAddTerminal(devMachine.get().getName(), options); @@ -363,7 +365,7 @@ public class ProcessesPanelPresenter extends BasePresenter /** Selects dev machine. */ private void selectDevMachine() { - Optional devMachine = appContext.getWorkspace().getDevMachine(); + Optional devMachine = wsAgentServerUtil.getWsAgentServerMachine(); if (!devMachine.isPresent()) { return; } @@ -598,9 +600,7 @@ public class ProcessesPanelPresenter extends BasePresenter } public void addCommandOutput(OutputConsole outputConsole) { - final WorkspaceImpl workspace = appContext.getWorkspace(); - final Optional devMachine = workspace.getDevMachine(); - + Optional devMachine = wsAgentServerUtil.getWsAgentServerMachine(); devMachine.ifPresent(machine -> addCommandOutput(machine.getName(), outputConsole)); } @@ -859,12 +859,12 @@ public class ProcessesPanelPresenter extends BasePresenter return false; } - Server terminalServer = machine.getServers().get(serverName); - if (terminalServer == null) { + Server server = machine.getServers().get(serverName); + if (server == null) { return false; } - return terminalServer.getStatus() == ServerStatus.RUNNING; + return server.getStatus() == ServerStatus.RUNNING; } /** @@ -901,22 +901,23 @@ public class ProcessesPanelPresenter extends BasePresenter return null; } - final ProcessTreeNode newMachineNode = + ProcessTreeNode machineNode = new ProcessTreeNode(MACHINE_NODE, rootNode, machineName, null, children); - newMachineNode.setTerminalServerRunning( - isServerRunning(machineName, SERVER_TERMINAL_REFERENCE)); - // TODO (spi ide): for now SSH server's status is always UNKNOWN. - // So check ws-agent's status till SSH server's status fixed. - newMachineNode.setSshServerRunning( - isServerRunning(machineName, SERVER_WS_AGENT_HTTP_REFERENCE)); + + machineNode.setTerminalServerRunning(isServerRunning(machineName, SERVER_TERMINAL_REFERENCE)); + + // rely on "wsagent" server's status since "ssh" server's status is always UNKNOWN + String wsAgentServerRef = wsAgentServerUtil.getWsAgentHttpServerReference(); + machineNode.setSshServerRunning(isServerRunning(machineName, wsAgentServerRef)); + for (ProcessTreeNode child : children) { - child.setParent(newMachineNode); + child.setParent(machineNode); } - machineNodes.put(machineName, newMachineNode); + machineNodes.put(machineName, machineNode); // add to children - rootNode.getChildren().add(newMachineNode); + rootNode.getChildren().add(machineNode); // update the view view.setProcessesData(rootNode); @@ -924,10 +925,10 @@ public class ProcessesPanelPresenter extends BasePresenter // add output for the machine if it is not exist if (!consoles.containsKey(machineName)) { OutputConsole outputConsole = commandConsoleFactory.create(machineName); - addOutputConsole(machineName, newMachineNode, outputConsole, true); + addOutputConsole(machineName, machineNode, outputConsole, true); } - return newMachineNode; + return machineNode; } private List getMachines() { @@ -963,18 +964,13 @@ public class ProcessesPanelPresenter extends BasePresenter return; } - MachineImpl devMachine = null; - for (MachineImpl machine : wsMachines) { - if (machine.getServerByName(SERVER_WS_AGENT_HTTP_REFERENCE).isPresent()) { - devMachine = machine; - break; - } - } + Optional wsAgentServerMachine = wsAgentServerUtil.getWsAgentServerMachine(); ProcessTreeNode machineToSelect = null; - if (devMachine != null) { - machineToSelect = provideMachineNode(devMachine.getName(), true); - wsMachines.remove(devMachine); + if (wsAgentServerMachine.isPresent()) { + MachineImpl machine = wsAgentServerMachine.get(); + machineToSelect = provideMachineNode(machine.getName(), true); + wsMachines.remove(machine); } for (MachineImpl machine : wsMachines) { @@ -1051,7 +1047,7 @@ public class ProcessesPanelPresenter extends BasePresenter @Override public void onTerminalAgentServerRunning(TerminalAgentServerRunningEvent event) { // open terminal automatically for dev-machine only - Optional devMachine = appContext.getWorkspace().getDevMachine(); + Optional devMachine = wsAgentServerUtil.getWsAgentServerMachine(); if (devMachine.isPresent() && event.getMachineName().equals(devMachine.get().getName())) { provideMachineNode(event.getMachineName(), true); @@ -1349,13 +1345,13 @@ public class ProcessesPanelPresenter extends BasePresenter @Override public void onDownloadWorkspaceOutput(DownloadWorkspaceOutputEvent event) { - WorkspaceImpl workspace = appContext.getWorkspace(); - Optional devMachine = workspace.getDevMachine(); + Optional devMachine = wsAgentServerUtil.getWsAgentServerMachine(); if (!devMachine.isPresent()) { return; } + WorkspaceImpl workspace = appContext.getWorkspace(); String fileName = workspace.getNamespace() + "-" diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/projectimport/ProjectImportNotificationSubscriber.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/projectimport/ProjectImportNotificationSubscriber.java index ccfbcd018d..e6b9013c08 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/projectimport/ProjectImportNotificationSubscriber.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/projectimport/ProjectImportNotificationSubscriber.java @@ -13,17 +13,15 @@ package org.eclipse.che.ide.projectimport; import static org.eclipse.che.api.core.model.workspace.runtime.ServerStatus.RUNNING; import static org.eclipse.che.api.project.shared.Constants.EVENT_IMPORT_OUTPUT_SUBSCRIBE; import static org.eclipse.che.api.project.shared.Constants.EVENT_IMPORT_OUTPUT_UN_SUBSCRIBE; -import static org.eclipse.che.api.workspace.shared.Constants.SERVER_WS_AGENT_HTTP_REFERENCE; import static org.eclipse.che.ide.api.jsonrpc.Constants.WS_AGENT_JSON_RPC_ENDPOINT_ID; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.web.bindery.event.shared.EventBus; import org.eclipse.che.api.core.jsonrpc.commons.RequestTransmitter; -import org.eclipse.che.ide.api.app.AppContext; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.event.WsAgentServerRunningEvent; import org.eclipse.che.ide.api.workspace.event.WsAgentServerStoppedEvent; -import org.eclipse.che.ide.api.workspace.model.ServerImpl; import org.eclipse.che.ide.bootstrap.BasicIDEInitializedEvent; /** @@ -38,7 +36,7 @@ public class ProjectImportNotificationSubscriber { @Inject public ProjectImportNotificationSubscriber( - EventBus eventBus, AppContext appContext, RequestTransmitter transmitter) { + EventBus eventBus, RequestTransmitter transmitter, WsAgentServerUtil wsAgentServerUtil) { this.transmitter = transmitter; eventBus.addHandler(WsAgentServerRunningEvent.TYPE, event -> subscribe()); @@ -47,13 +45,14 @@ public class ProjectImportNotificationSubscriber { eventBus.addHandler( BasicIDEInitializedEvent.TYPE, event -> - appContext - .getWorkspace() - .getDevMachine() - .flatMap(machine -> machine.getServerByName(SERVER_WS_AGENT_HTTP_REFERENCE)) - .map(ServerImpl::getStatus) - .filter(RUNNING::equals) - .ifPresent(it -> subscribe())); + wsAgentServerUtil + .getWsAgentHttpServer() + .ifPresent( + server -> { + if (server.getStatus() == RUNNING) { + subscribe(); + } + })); } private void subscribe() { diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/workspace/events/ServerStatusEventHandler.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/workspace/events/ServerStatusEventHandler.java index 5f255d6af9..7737ca31d2 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/workspace/events/ServerStatusEventHandler.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/workspace/events/ServerStatusEventHandler.java @@ -15,7 +15,6 @@ import static org.eclipse.che.api.core.model.workspace.runtime.ServerStatus.STOP import static org.eclipse.che.api.workspace.shared.Constants.SERVER_EXEC_AGENT_HTTP_REFERENCE; import static org.eclipse.che.api.workspace.shared.Constants.SERVER_STATUS_CHANGED_METHOD; import static org.eclipse.che.api.workspace.shared.Constants.SERVER_TERMINAL_REFERENCE; -import static org.eclipse.che.api.workspace.shared.Constants.SERVER_WS_AGENT_HTTP_REFERENCE; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -23,6 +22,7 @@ import com.google.web.bindery.event.shared.EventBus; import org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerConfigurator; import org.eclipse.che.api.workspace.shared.dto.event.ServerStatusEvent; import org.eclipse.che.ide.api.app.AppContext; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.event.ExecAgentServerRunningEvent; import org.eclipse.che.ide.api.workspace.event.ExecAgentServerStoppedEvent; import org.eclipse.che.ide.api.workspace.event.ServerRunningEvent; @@ -45,16 +45,19 @@ class ServerStatusEventHandler { private final WorkspaceServiceClient workspaceServiceClient; private final AppContext appContext; private final EventBus eventBus; + private final WsAgentServerUtil wsAgentServerUtil; @Inject ServerStatusEventHandler( RequestHandlerConfigurator configurator, WorkspaceServiceClient workspaceServiceClient, AppContext appContext, - EventBus eventBus) { + EventBus eventBus, + WsAgentServerUtil wsAgentServerUtil) { this.workspaceServiceClient = workspaceServiceClient; this.appContext = appContext; this.eventBus = eventBus; + this.wsAgentServerUtil = wsAgentServerUtil; configurator .newConfiguration() @@ -78,12 +81,14 @@ class ServerStatusEventHandler { // Because AppContext always must return an actual workspace model. ((AppContextImpl) appContext).setWorkspace(workspace); + String wsAgentHttpServerRef = wsAgentServerUtil.getWsAgentHttpServerReference(); + if (event.getStatus() == RUNNING) { eventBus.fireEvent( new ServerRunningEvent(event.getServerName(), event.getMachineName())); // fire events for the often used servers - if (SERVER_WS_AGENT_HTTP_REFERENCE.equals(event.getServerName())) { + if (wsAgentHttpServerRef.equals(event.getServerName())) { eventBus.fireEvent(new WsAgentServerRunningEvent(event.getMachineName())); } else if (SERVER_TERMINAL_REFERENCE.equals(event.getServerName())) { eventBus.fireEvent(new TerminalAgentServerRunningEvent(event.getMachineName())); @@ -95,7 +100,7 @@ class ServerStatusEventHandler { new ServerStoppedEvent(event.getServerName(), event.getMachineName())); // fire events for the often used servers - if (SERVER_WS_AGENT_HTTP_REFERENCE.equals(event.getServerName())) { + if (wsAgentHttpServerRef.equals(event.getServerName())) { eventBus.fireEvent(new WsAgentServerStoppedEvent(event.getMachineName())); } else if (SERVER_TERMINAL_REFERENCE.equals(event.getServerName())) { eventBus.fireEvent(new TerminalAgentServerStoppedEvent(event.getMachineName())); diff --git a/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/actions/RunCommandActionTest.java b/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/actions/RunCommandActionTest.java index f1398bcd1b..214a537499 100644 --- a/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/actions/RunCommandActionTest.java +++ b/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/actions/RunCommandActionTest.java @@ -22,12 +22,11 @@ import java.util.Collections; import java.util.Optional; import org.eclipse.che.ide.CoreLocalizationConstant; import org.eclipse.che.ide.api.action.ActionEvent; -import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.command.CommandExecutor; import org.eclipse.che.ide.api.command.CommandImpl; import org.eclipse.che.ide.api.command.CommandManager; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.model.MachineImpl; -import org.eclipse.che.ide.api.workspace.model.WorkspaceImpl; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -47,7 +46,7 @@ public class RunCommandActionTest { @Mock private CoreLocalizationConstant locale; @Mock private ActionEvent event; @Mock private CommandImpl command; - @Mock private AppContext appContext; + @Mock private WsAgentServerUtil wsAgentServerUtil; @InjectMocks private RunCommandAction action; @@ -68,10 +67,8 @@ public class RunCommandActionTest { public void actionShouldBePerformed() { when(event.getParameters()).thenReturn(Collections.singletonMap(NAME_PROPERTY, "MCI")); - WorkspaceImpl workspace = mock(WorkspaceImpl.class); MachineImpl machine = mock(MachineImpl.class); - when(workspace.getDevMachine()).thenReturn(Optional.of(machine)); - when(appContext.getWorkspace()).thenReturn(workspace); + when(wsAgentServerUtil.getWsAgentServerMachine()).thenReturn(Optional.of(machine)); action.actionPerformed(event); diff --git a/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/command/toolbar/previews/PreviewUrlTest.java b/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/command/toolbar/previews/PreviewUrlTest.java index 6e9930455f..9b3a457e44 100644 --- a/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/command/toolbar/previews/PreviewUrlTest.java +++ b/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/command/toolbar/previews/PreviewUrlTest.java @@ -17,10 +17,9 @@ import static org.mockito.Mockito.when; import java.util.HashMap; import java.util.Map; import java.util.Optional; -import org.eclipse.che.ide.api.app.AppContext; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.model.MachineImpl; import org.eclipse.che.ide.api.workspace.model.ServerImpl; -import org.eclipse.che.ide.api.workspace.model.WorkspaceImpl; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -35,7 +34,7 @@ public class PreviewUrlTest { private static final String MACHINE_NAME = "dev-machine"; private static final String SERVER_PORT = "8080"; - @Mock private AppContext appContext; + @Mock private WsAgentServerUtil wsAgentServerUtil; private PreviewUrl previewUrl; @@ -51,11 +50,9 @@ public class PreviewUrlTest { when(devMachine.getName()).thenReturn(MACHINE_NAME); when(devMachine.getServers()).thenReturn(servers); - WorkspaceImpl workspace = mock(WorkspaceImpl.class); - when(workspace.getDevMachine()).thenReturn(Optional.of(devMachine)); - when(appContext.getWorkspace()).thenReturn(workspace); + when(wsAgentServerUtil.getWsAgentServerMachine()).thenReturn(Optional.of(devMachine)); - previewUrl = new PreviewUrl(PREVIEW_URL, appContext); + previewUrl = new PreviewUrl(PREVIEW_URL, wsAgentServerUtil); } @Test diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/context/QueryParameters.java b/ide/commons-gwt/src/main/java/org/eclipse/che/ide/QueryParameters.java similarity index 97% rename from ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/context/QueryParameters.java rename to ide/commons-gwt/src/main/java/org/eclipse/che/ide/QueryParameters.java index f1bac501ef..0cf467ef78 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/context/QueryParameters.java +++ b/ide/commons-gwt/src/main/java/org/eclipse/che/ide/QueryParameters.java @@ -8,7 +8,7 @@ * Contributors: * Red Hat, Inc. - initial API and implementation */ -package org.eclipse.che.ide.context; +package org.eclipse.che.ide; import com.google.gwt.user.client.Window; import java.util.HashMap; diff --git a/multiuser/keycloak/che-multiuser-keycloak-ide/src/main/java/org/eclipse/che/multiuser/keycloak/ide/KeycloakAsyncRequestFactory.java b/multiuser/keycloak/che-multiuser-keycloak-ide/src/main/java/org/eclipse/che/multiuser/keycloak/ide/KeycloakAsyncRequestFactory.java index d1fd948f95..5b362251cc 100644 --- a/multiuser/keycloak/che-multiuser-keycloak-ide/src/main/java/org/eclipse/che/multiuser/keycloak/ide/KeycloakAsyncRequestFactory.java +++ b/multiuser/keycloak/che-multiuser-keycloak-ide/src/main/java/org/eclipse/che/multiuser/keycloak/ide/KeycloakAsyncRequestFactory.java @@ -14,10 +14,10 @@ import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.http.client.RequestBuilder; import com.google.inject.Inject; import com.google.inject.Singleton; -import com.google.web.bindery.event.shared.EventBus; import java.util.List; import org.eclipse.che.ide.MimeType; import org.eclipse.che.ide.api.app.AppContext; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.dto.DtoFactory; import org.eclipse.che.ide.rest.AsyncRequest; import org.eclipse.che.ide.rest.HTTPHeader; @@ -35,8 +35,8 @@ public class KeycloakAsyncRequestFactory extends MachineAsyncRequestFactory { KeycloakProvider keycloakProvider, DtoFactory dtoFactory, AppContext appContext, - EventBus eventBus) { - super(dtoFactory, appContext, eventBus); + WsAgentServerUtil wsAgentServerUtil) { + super(dtoFactory, appContext, wsAgentServerUtil); this.dtoFactory = dtoFactory; this.keycloakProvider = keycloakProvider; } diff --git a/multiuser/machine-auth/che-multiuser-machine-authentication-ide/src/main/java/org/eclipse/che/multiuser/machine/authentication/ide/MachineAsyncRequestFactory.java b/multiuser/machine-auth/che-multiuser-machine-authentication-ide/src/main/java/org/eclipse/che/multiuser/machine/authentication/ide/MachineAsyncRequestFactory.java index 9d375e3540..3b74e890fa 100644 --- a/multiuser/machine-auth/che-multiuser-machine-authentication-ide/src/main/java/org/eclipse/che/multiuser/machine/authentication/ide/MachineAsyncRequestFactory.java +++ b/multiuser/machine-auth/che-multiuser-machine-authentication-ide/src/main/java/org/eclipse/che/multiuser/machine/authentication/ide/MachineAsyncRequestFactory.java @@ -17,13 +17,12 @@ import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.Response; import com.google.inject.Inject; import com.google.inject.Singleton; -import com.google.web.bindery.event.shared.EventBus; import java.util.Optional; import org.eclipse.che.api.promises.client.Promise; import org.eclipse.che.api.promises.client.js.Promises; import org.eclipse.che.ide.api.app.AppContext; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.model.MachineImpl; -import org.eclipse.che.ide.api.workspace.model.RuntimeImpl; import org.eclipse.che.ide.api.workspace.model.WorkspaceImpl; import org.eclipse.che.ide.commons.exception.UnmarshallerException; import org.eclipse.che.ide.dto.DtoFactory; @@ -42,13 +41,15 @@ public class MachineAsyncRequestFactory extends AsyncRequestFactory { private static final String CSRF_TOKEN_HEADER_NAME = "X-CSRF-Token"; private AppContext appContext; + private WsAgentServerUtil wsAgentServerUtil; private String csrfToken; @Inject public MachineAsyncRequestFactory( - DtoFactory dtoFactory, AppContext appContext, EventBus eventBus) { + DtoFactory dtoFactory, AppContext appContext, WsAgentServerUtil wsAgentServerUtil) { super(dtoFactory); this.appContext = appContext; + this.wsAgentServerUtil = wsAgentServerUtil; } @Override @@ -73,22 +74,14 @@ public class MachineAsyncRequestFactory extends AsyncRequestFactory { */ protected boolean isWsAgentRequest(String url) { WorkspaceImpl currentWorkspace = appContext.getWorkspace(); - if (currentWorkspace == null || !isWsAgentStarted(currentWorkspace)) { + if (currentWorkspace == null || !isWsAgentStarted()) { return false; // ws-agent not started } return url.contains(nullToEmpty(appContext.getWsAgentServerApiEndpoint())); } - private boolean isWsAgentStarted(WorkspaceImpl workspace) { - if (workspace == null) { - return false; - } - RuntimeImpl runtime = workspace.getRuntime(); - if (runtime == null) { - return false; - } - - Optional devMachine = runtime.getDevMachine(); + private boolean isWsAgentStarted() { + Optional devMachine = wsAgentServerUtil.getWsAgentServerMachine(); return devMachine.isPresent(); } @@ -116,6 +109,12 @@ public class MachineAsyncRequestFactory extends AsyncRequestFactory { }); } + private boolean isModifyingMethod(RequestBuilder.Method method) { + return method == RequestBuilder.POST + || method == RequestBuilder.PUT + || method == RequestBuilder.DELETE; + } + private class CsrfPreventingAsyncModifyingRequest extends AsyncRequest { protected CsrfPreventingAsyncModifyingRequest( @@ -137,10 +136,4 @@ public class MachineAsyncRequestFactory extends AsyncRequestFactory { }); } } - - private boolean isModifyingMethod(RequestBuilder.Method method) { - return method == RequestBuilder.POST - || method == RequestBuilder.PUT - || method == RequestBuilder.DELETE; - } } diff --git a/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/main/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationPagePresenter.java b/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/main/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationPagePresenter.java index 9b51dc1c6f..d1e8398e20 100644 --- a/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/main/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationPagePresenter.java +++ b/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/main/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationPagePresenter.java @@ -18,11 +18,10 @@ import java.util.List; import java.util.Map; import javax.validation.constraints.NotNull; import org.eclipse.che.api.core.model.workspace.runtime.Server; -import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.debug.DebugConfiguration; import org.eclipse.che.ide.api.debug.DebugConfigurationPage; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.model.MachineImpl; -import org.eclipse.che.ide.api.workspace.model.WorkspaceImpl; import org.eclipse.che.ide.util.Pair; /** @@ -36,7 +35,7 @@ public class JavaDebugConfigurationPagePresenter DebugConfigurationPage { private final JavaDebugConfigurationPageView view; - private final AppContext appContext; + private final WsAgentServerUtil wsAgentServerUtil; private DebugConfiguration editedConfiguration; private String originHost; @@ -45,9 +44,9 @@ public class JavaDebugConfigurationPagePresenter @Inject public JavaDebugConfigurationPagePresenter( - JavaDebugConfigurationPageView view, AppContext appContext) { + JavaDebugConfigurationPageView view, WsAgentServerUtil wsAgentServerUtil) { this.view = view; - this.appContext = appContext; + this.wsAgentServerUtil = wsAgentServerUtil; view.setDelegate(this); } @@ -74,8 +73,9 @@ public class JavaDebugConfigurationPagePresenter } private void setPortsList() { - WorkspaceImpl workspace = appContext.getWorkspace(); - workspace.getDevMachine().ifPresent(machine -> view.setPortsList(extractPortsList(machine))); + wsAgentServerUtil + .getWsAgentServerMachine() + .ifPresent(machine -> view.setPortsList(extractPortsList(machine))); } /** Extracts list of ports available for connecting to the remote debugger. */ diff --git a/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/test/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationPagePresenterTest.java b/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/test/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationPagePresenterTest.java index 30b082e763..502adcc014 100644 --- a/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/test/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationPagePresenterTest.java +++ b/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/test/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationPagePresenterTest.java @@ -21,12 +21,11 @@ import com.google.gwt.user.client.ui.AcceptsOneWidget; import java.util.HashMap; import java.util.Map; import java.util.Optional; -import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.debug.DebugConfiguration; import org.eclipse.che.ide.api.debug.DebugConfigurationPage; +import org.eclipse.che.ide.api.workspace.WsAgentServerUtil; import org.eclipse.che.ide.api.workspace.model.MachineImpl; import org.eclipse.che.ide.api.workspace.model.ServerImpl; -import org.eclipse.che.ide.api.workspace.model.WorkspaceImpl; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; @@ -43,9 +42,8 @@ public class JavaDebugConfigurationPagePresenterTest { private static final int PORT = 8000; @Mock private JavaDebugConfigurationPageView pageView; - @Mock private AppContext appContext; + @Mock private WsAgentServerUtil wsAgentServerUtil; @Mock private MachineImpl devMachine; - @Mock private WorkspaceImpl workspace; @Mock private DebugConfiguration configuration; @@ -62,8 +60,7 @@ public class JavaDebugConfigurationPagePresenterTest { servers.put("8000/tcp", server); when(devMachine.getServers()).thenReturn(servers); - when(workspace.getDevMachine()).thenReturn(Optional.of(devMachine)); - when(appContext.getWorkspace()).thenReturn(workspace); + when(wsAgentServerUtil.getWsAgentServerMachine()).thenReturn(Optional.of(devMachine)); when(devMachine.getName()).thenReturn("devMachine"); pagePresenter.resetFrom(configuration);