From c6724e4e440e0ee3ab56c2e0c827e60d214109ee Mon Sep 17 00:00:00 2001 From: Max Shaposhnik Date: Mon, 18 Apr 2016 15:34:13 +0300 Subject: [PATCH] CODENVY-282 check permissions before trying to start any workspace --- .../eclipse/che/ide/util/ExceptionUtils.java | 19 ++++- .../che/ide/workspace/WorkspaceComponent.java | 74 ++++++++++++------- 2 files changed, 63 insertions(+), 30 deletions(-) diff --git a/core/commons/che-core-commons-gwt/src/main/java/org/eclipse/che/ide/util/ExceptionUtils.java b/core/commons/che-core-commons-gwt/src/main/java/org/eclipse/che/ide/util/ExceptionUtils.java index 73433c9a3961..4054161735dc 100644 --- a/core/commons/che-core-commons-gwt/src/main/java/org/eclipse/che/ide/util/ExceptionUtils.java +++ b/core/commons/che-core-commons-gwt/src/main/java/org/eclipse/che/ide/util/ExceptionUtils.java @@ -23,8 +23,6 @@ /** Utility class for common Exception related operations. */ public class ExceptionUtils { - private static DtoFactory dtoFactory = new DtoFactory(); - public static final int MAX_CAUSE = 10; public static String getStackTraceAsString(Throwable e) { @@ -102,4 +100,21 @@ public static Map getAttributes(Throwable exception) { return Collections.emptyMap(); } } + + /** + * Returns HTTP status the exception if it is of type {@clink ServerException} or -1 otherwise. + * + * @param exception + * passed exception + * @return status code + */ + public static int getStatusCode(Throwable exception) { + if (exception instanceof ServerException) { + return ((ServerException)exception).getHTTPStatus(); + } else if (exception instanceof org.eclipse.che.ide.websocket.rest.exceptions.ServerException) { + return ((org.eclipse.che.ide.websocket.rest.exceptions.ServerException)exception).getHTTPStatus(); + } else { + return -1; + } + } } diff --git a/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/workspace/WorkspaceComponent.java b/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/workspace/WorkspaceComponent.java index 38fe0c765bc6..67af217a6a52 100644 --- a/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/workspace/WorkspaceComponent.java +++ b/core/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/workspace/WorkspaceComponent.java @@ -34,6 +34,7 @@ import org.eclipse.che.ide.CoreLocalizationConstant; import org.eclipse.che.ide.actions.WorkspaceSnapshotCreator; import org.eclipse.che.ide.api.app.AppContext; +import org.eclipse.che.ide.api.event.HttpSessionDestroyedEvent; import org.eclipse.che.ide.api.notification.NotificationManager; import org.eclipse.che.ide.api.notification.StatusNotification; import org.eclipse.che.ide.api.preferences.PreferencesManager; @@ -41,11 +42,13 @@ import org.eclipse.che.ide.api.component.Component; import org.eclipse.che.ide.dto.DtoFactory; import org.eclipse.che.ide.rest.DtoUnmarshallerFactory; +import org.eclipse.che.ide.rest.HTTPStatus; import org.eclipse.che.ide.ui.dialogs.CancelCallback; import org.eclipse.che.ide.ui.dialogs.ConfirmCallback; import org.eclipse.che.ide.ui.dialogs.DialogFactory; import org.eclipse.che.ide.ui.loaders.initialization.InitialLoadingInfo; import org.eclipse.che.ide.ui.loaders.initialization.LoaderPresenter; +import org.eclipse.che.ide.util.ExceptionUtils; import org.eclipse.che.ide.util.loging.Log; import org.eclipse.che.ide.websocket.MessageBus; import org.eclipse.che.ide.websocket.MessageBusProvider; @@ -182,39 +185,54 @@ public void setCurrentWorkspace(WorkspaceDto workspace) { */ public void startWorkspaceById(final WorkspaceDto workspace, final Callback callback) { this.callback = callback; - loader.show(initialLoadingInfo); - initialLoadingInfo.setOperationStatus(WORKSPACE_BOOTING.getValue(), IN_PROGRESS); - - if (messageBus != null) { - messageBus.cancelReconnection(); - } - messageBus = messageBusProvider.createMessageBus(workspace.getId()); - - messageBus.addOnOpenHandler(new ConnectionOpenedHandler() { + workspaceServiceClient.getWorkspace(workspace.getId()).then(new Operation() { @Override - public void onOpen() { - messageBus.removeOnOpenHandler(this); - subscribeToWorkspaceStatusWebSocket(workspace); - - if (!RUNNING.equals(workspace.getStatus())) { - workspaceServiceClient.getSnapshot(workspace.getId()).then(new Operation>() { - @Override - public void apply(List snapshots) throws OperationException { - if (snapshots.isEmpty()) { - handleWsStart(workspaceServiceClient.startById(workspace.getId(), - workspace.getConfig().getDefaultEnv())); - } else { - showRecoverWorkspaceConfirmDialog(workspace); - } + public void apply(WorkspaceDto arg) throws OperationException { + loader.show(initialLoadingInfo); + initialLoadingInfo.setOperationStatus(WORKSPACE_BOOTING.getValue(), IN_PROGRESS); + + if (messageBus != null) { + messageBus.cancelReconnection(); + } + messageBus = messageBusProvider.createMessageBus(workspace.getId()); + + messageBus.addOnOpenHandler(new ConnectionOpenedHandler() { + @Override + public void onOpen() { + messageBus.removeOnOpenHandler(this); + subscribeToWorkspaceStatusWebSocket(workspace); + + if (!RUNNING.equals(workspace.getStatus())) { + workspaceServiceClient.getSnapshot(workspace.getId()).then(new Operation>() { + @Override + public void apply(List snapshots) throws OperationException { + if (snapshots.isEmpty()) { + handleWsStart(workspaceServiceClient.startById(workspace.getId(), + workspace.getConfig().getDefaultEnv())); + } else { + showRecoverWorkspaceConfirmDialog(workspace); + } + } + }); + } else { + initialLoadingInfo.setOperationStatus(WORKSPACE_BOOTING.getValue(), SUCCESS); + setCurrentWorkspace(workspace); + eventBus.fireEvent(new WorkspaceStartedEvent(workspace)); } - }); - } else { - initialLoadingInfo.setOperationStatus(WORKSPACE_BOOTING.getValue(), SUCCESS); - setCurrentWorkspace(workspace); - eventBus.fireEvent(new WorkspaceStartedEvent(workspace)); + } + }); + } + }).catchError(new Operation() { + @Override + public void apply(PromiseError err) throws OperationException { + Log.error(getClass(), err.getCause()); + if (ExceptionUtils.getStatusCode(err.getCause()) == HTTPStatus.FORBIDDEN) { + eventBus.fireEvent(new HttpSessionDestroyedEvent()); } } }); + + } /**