/*******************************************************************************
* 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.projectimport.wizard;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.api.core.model.project.SourceStorage;
import org.eclipse.che.api.project.shared.Constants;
import org.eclipse.che.api.project.shared.dto.SourceEstimation;
import org.eclipse.che.api.promises.client.Function;
import org.eclipse.che.api.promises.client.FunctionException;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.promises.client.PromiseError;
import org.eclipse.che.api.promises.client.PromiseProvider;
import org.eclipse.che.ide.api.project.MutableProjectConfig;
import org.eclipse.che.ide.api.project.type.ProjectTypeRegistry;
import org.eclipse.che.ide.api.resources.Project;
import org.eclipse.che.ide.projecttype.wizard.presenter.ProjectWizardPresenter;
import org.eclipse.che.ide.util.loging.Log;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
/**
* The class contains business logic which allows resolve project type and call updater.
*
* @author Dmitry Shnurenko
* @author Vlad Zhukovskyi
*/
@Singleton
public class ProjectResolver {
private final ProjectTypeRegistry projectTypeRegistry;
private final PromiseProvider promiseProvider;
private final ProjectWizardPresenter projectWizard;
@Inject
public ProjectResolver(ProjectTypeRegistry projectTypeRegistry,
PromiseProvider promiseProvider,
ProjectWizardPresenter projectWizard) {
this.projectTypeRegistry = projectTypeRegistry;
this.promiseProvider = promiseProvider;
this.projectWizard = projectWizard;
}
public Promise<Project> resolve(final Project project) {
return project.resolve().thenPromise(new Function<List<SourceEstimation>, Promise<Project>>() {
@Override
public Promise<Project> apply(List<SourceEstimation> estimations) throws FunctionException {
if (estimations == null || estimations.isEmpty()) {
return promiseProvider.resolve(project);
}
final List<String> primeTypes = newArrayList();
for (SourceEstimation estimation : estimations) {
if (projectTypeRegistry.getProjectType(estimation.getType()).isPrimaryable()) {
primeTypes.add(estimation.getType());
}
}
final MutableProjectConfig config = new MutableProjectConfig(project);
final SourceStorage source = project.getSource();
if (source != null && source.getParameters() != null && source.getParameters().containsKey("keepDir")) {
config.setType(Constants.BLANK_ID);
} else if (primeTypes.isEmpty()) {
return promiseProvider.resolve(project);
} else if (primeTypes.size() == 1) {
config.setType(primeTypes.get(0));
} else {
config.setType(Constants.BLANK_ID);
projectWizard.show(config);
return promiseProvider.resolve(project);
}
return project.update().withBody(config).send();
}
}).catchErrorPromise(new Function<PromiseError, Promise<Project>>() {
@Override
public Promise<Project> apply(PromiseError error) throws FunctionException {
Log.warn(ProjectResolver.class, error.getMessage());
return promiseProvider.resolve(project);
}
});
}
}