/******************************************************************************* * 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.plugin.pullrequest.client.steps; import org.eclipse.che.plugin.pullrequest.client.ContributeMessages; import org.eclipse.che.plugin.pullrequest.client.workflow.Context; import org.eclipse.che.plugin.pullrequest.client.workflow.Step; import org.eclipse.che.plugin.pullrequest.client.workflow.WorkflowExecutor; import org.eclipse.che.plugin.pullrequest.shared.dto.HostUser; import com.google.inject.Singleton; import org.eclipse.che.api.promises.client.Operation; import org.eclipse.che.api.promises.client.OperationException; import org.eclipse.che.api.promises.client.PromiseError; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.notification.NotificationManager; import org.eclipse.che.ide.commons.exception.UnauthorizedException; import javax.inject.Inject; import static org.eclipse.che.ide.api.notification.StatusNotification.DisplayMode.FLOAT_MODE; import static org.eclipse.che.ide.api.notification.StatusNotification.Status.FAIL; /** * This step authorizes Codenvy on the VCS Host. * * @author Kevin Pollet * @author Yevhenii Voevodin */ @Singleton public class AuthorizeCodenvyOnVCSHostStep implements Step { private final NotificationManager notificationManager; private final AppContext appContext; private final ContributeMessages messages; @Inject public AuthorizeCodenvyOnVCSHostStep(final NotificationManager notificationManager, final AppContext appContext, final ContributeMessages messages) { this.notificationManager = notificationManager; this.appContext = appContext; this.messages = messages; } @Override public void execute(final WorkflowExecutor executor, Context context) { context.getVcsHostingService() .getUserInfo() .then(authSuccessOp(executor, context)) .catchError(getUserErrorOp(executor, context)); } private Operation<HostUser> authSuccessOp(final WorkflowExecutor executor, final Context context) { return new Operation<HostUser>() { @Override public void apply(HostUser user) throws OperationException { context.setHostUserLogin(user.getLogin()); executor.done(AuthorizeCodenvyOnVCSHostStep.this, context); } }; } private Operation<PromiseError> getUserErrorOp(final WorkflowExecutor executor, final Context context) { return new Operation<PromiseError>() { @Override public void apply(PromiseError error) throws OperationException { try { throw error.getCause(); } catch (UnauthorizedException unEx) { authenticate(executor, context); } catch (Throwable thr) { handleThrowable(thr, executor, context); } } }; } private void authenticate(final WorkflowExecutor executor, final Context context) { context.getVcsHostingService() .authenticate(appContext.getCurrentUser()) .then(authSuccessOp(executor, context)) .catchError(new Operation<PromiseError>() { @Override public void apply(PromiseError err) throws OperationException { try { throw err.getCause(); } catch (UnauthorizedException unEx) { notificationManager.notify(messages.stepAuthorizeCodenvyOnVCSHostErrorCannotAccessVCSHostTitle(), messages.stepAuthorizeCodenvyOnVCSHostErrorCannotAccessVCSHostContent(), FAIL, FLOAT_MODE); executor.fail(AuthorizeCodenvyOnVCSHostStep.this, context, unEx.getLocalizedMessage()); } catch (Throwable thr) { handleThrowable(thr, executor, context); } } }); } private void handleThrowable(final Throwable thr, final WorkflowExecutor workflow, final Context context) { notificationManager.notify(thr.getLocalizedMessage(), FAIL, FLOAT_MODE); workflow.fail(this, context, thr.getLocalizedMessage()); } }