/*******************************************************************************
* 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.utils.FactoryHelper;
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 com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
import com.google.inject.Singleton;
import org.eclipse.che.api.factory.shared.dto.FactoryDto;
import org.eclipse.che.api.promises.client.Function;
import org.eclipse.che.api.promises.client.FunctionException;
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.api.workspace.shared.dto.ProjectConfigDto;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.factory.FactoryServiceClient;
import org.eclipse.che.ide.api.notification.NotificationManager;
import javax.inject.Inject;
import static org.eclipse.che.ide.api.notification.StatusNotification.DisplayMode.NOT_EMERGE_MODE;
import static org.eclipse.che.ide.api.notification.StatusNotification.Status.FAIL;
/**
* Generates a factory for the contribution reviewer.
*/
@Singleton
public class GenerateReviewFactoryStep implements Step {
private final ContributeMessages messages;
private final AppContext appContext;
private final NotificationManager notificationManager;
private final FactoryServiceClient factoryService;
@Inject
public GenerateReviewFactoryStep(final ContributeMessages messages,
final AppContext appContext,
final NotificationManager notificationManager,
final FactoryServiceClient factoryService) {
this.messages = messages;
this.appContext = appContext;
this.notificationManager = notificationManager;
this.factoryService = factoryService;
}
@Override
public void execute(final WorkflowExecutor executor, final Context context) {
factoryService.getFactoryJson(appContext.getWorkspaceId(), null)
.then(updateProjectAttributes(context))
.then(new Operation<FactoryDto>() {
@Override
public void apply(FactoryDto factory) throws OperationException {
factoryService.saveFactory(factory)
.then(new Operation<FactoryDto>() {
@Override
public void apply(FactoryDto factory) throws OperationException {
context.setReviewFactoryUrl(FactoryHelper.getAcceptFactoryUrl(factory));
executor.done(GenerateReviewFactoryStep.this, context);
}
})
.catchError(new Operation<PromiseError>() {
@Override
public void apply(PromiseError arg) throws OperationException {
notificationManager.notify(messages.stepGenerateReviewFactoryErrorCreateFactory(),
FAIL,
NOT_EMERGE_MODE);
executor.done(GenerateReviewFactoryStep.this, context);
}
});
}
})
.catchError(new Operation<PromiseError>() {
@Override
public void apply(PromiseError arg) throws OperationException {
notificationManager.notify(messages.stepGenerateReviewFactoryErrorCreateFactory(),
FAIL,
NOT_EMERGE_MODE);
executor.done(GenerateReviewFactoryStep.this, context);
}
});
}
private Function<FactoryDto, FactoryDto> updateProjectAttributes(final Context context) {
return new Function<FactoryDto, FactoryDto>() {
@Override
public FactoryDto apply(FactoryDto factory) throws FunctionException {
final Optional<ProjectConfigDto> projectOpt = FluentIterable.from(factory.getWorkspace().getProjects())
.filter(new Predicate<ProjectConfigDto>() {
@Override
public boolean apply(ProjectConfigDto project) {
return project.getName()
.equals(context.getProject().getName());
}
}).first();
if (projectOpt.isPresent()) {
final ProjectConfigDto project = projectOpt.get();
project.getSource().getParameters().put("branch", context.getWorkBranchName());
if (context.isForkAvailable()) {
project.getSource().setLocation(context.getVcsHostingService()
.makeHttpRemoteUrl(context.getHostUserLogin(), context.getOriginRepositoryName()));
}
}
return factory;
}
};
}
}