/******************************************************************************* * 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.mainpage; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.inject.Inject; import org.eclipse.che.ide.api.project.ProjectImportersServiceClient; import org.eclipse.che.api.project.shared.dto.ProjectImporterData; import org.eclipse.che.api.project.shared.dto.ProjectImporterDescriptor; import org.eclipse.che.ide.CoreLocalizationConstant; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.notification.NotificationManager; import org.eclipse.che.ide.api.project.MutableProjectConfig; import org.eclipse.che.ide.api.project.wizard.ImportWizardRegistry; import org.eclipse.che.ide.api.wizard.AbstractWizardPage; import org.eclipse.che.ide.projectimport.wizard.presenter.ImportProjectWizardView; import org.eclipse.che.ide.rest.AsyncRequestCallback; import org.eclipse.che.ide.rest.DtoUnmarshallerFactory; import org.eclipse.che.ide.rest.Unmarshallable; import org.eclipse.che.ide.util.NameUtils; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import static org.eclipse.che.ide.api.notification.StatusNotification.DisplayMode.FLOAT_MODE; import static org.eclipse.che.ide.api.notification.StatusNotification.Status.FAIL; /** * Presenter of the import project wizard's main page. * * @author Ann Shumilova */ public class MainPagePresenter extends AbstractWizardPage<MutableProjectConfig> implements MainPageView.ActionDelegate { private static final String DEFAULT_PROJECT_IMPORTER = "default-importer"; private final MainPageView view; private final DtoUnmarshallerFactory dtoUnmarshallerFactory; private final NotificationManager notificationManager; private final CoreLocalizationConstant locale; private final ImportWizardRegistry importWizardRegistry; private final AppContext appContext; private final ProjectImportersServiceClient projectImportersService; private ImporterSelectionListener importerSelectionListener; private ProjectImporterDescriptor selectedProjectImporter; private ImportProjectWizardView.EnterPressedDelegate enterPressedDelegate; @Inject public MainPagePresenter(ProjectImportersServiceClient projectImportersService, DtoUnmarshallerFactory dtoUnmarshallerFactory, NotificationManager notificationManager, CoreLocalizationConstant locale, MainPageView view, ImportWizardRegistry importWizardRegistry, AppContext appContext) { super(); this.view = view; this.projectImportersService = projectImportersService; this.dtoUnmarshallerFactory = dtoUnmarshallerFactory; this.notificationManager = notificationManager; this.locale = locale; this.importWizardRegistry = importWizardRegistry; this.appContext = appContext; view.setDelegate(this); } @Override public void init(MutableProjectConfig dataObject) { super.init(dataObject); } public void setEnterPressedDelegate(ImportProjectWizardView.EnterPressedDelegate enterPressedDelegate) { this.enterPressedDelegate = enterPressedDelegate; } /** {@inheritDoc} */ @Override public void projectImporterSelected(ProjectImporterDescriptor importer) { selectedProjectImporter = importer; view.setImporterDescription(importer.getDescription()); if (importerSelectionListener != null) { importerSelectionListener.onImporterSelected(importer); } updateDelegate.updateControls(); } public AcceptsOneWidget getImporterPanel() { return view.getImporterPanel(); } @Override public boolean isCompleted() { final String projectName = dataObject.getName(); return selectedProjectImporter != null && projectName != null && NameUtils.checkProjectName(projectName); } @Override public void go(final AcceptsOneWidget container) { selectedProjectImporter = null; view.reset(); container.setWidget(view); loadImporters(); } private void loadImporters() { final Map<String, Set<ProjectImporterDescriptor>> importersByCategory = new LinkedHashMap<>(); final Unmarshallable<ProjectImporterData> unmarshaller = dtoUnmarshallerFactory.newUnmarshaller(ProjectImporterData.class); AsyncRequestCallback<ProjectImporterData> callback = new AsyncRequestCallback<ProjectImporterData>(unmarshaller) { @Override protected void onSuccess(ProjectImporterData data) { List<ProjectImporterDescriptor> result = data.getImporters(); String defaultImporterId = data.getConfiguration().get(DEFAULT_PROJECT_IMPORTER); Iterator<ProjectImporterDescriptor> itr = result.iterator(); while (itr.hasNext()) { ProjectImporterDescriptor importer = itr.next(); if (importer.getId().equals(defaultImporterId)) { Set<ProjectImporterDescriptor> importersSet = new LinkedHashSet<>(); importersSet.add(importer); importersByCategory.put(importer.getCategory(), importersSet); itr.remove(); } } ProjectImporterDescriptor defaultImporter = null; for (ProjectImporterDescriptor importer : result) { if (importer.isInternal() || importer.getCategory() == null || importWizardRegistry.getWizardRegistrar(importer.getId()) == null) { continue; } if (importersByCategory.containsKey(importer.getCategory())) { importersByCategory.get(importer.getCategory()).add(importer); } else { Set<ProjectImporterDescriptor> importersSet = new LinkedHashSet<>(); importersSet.add(importer); importersByCategory.put(importer.getCategory(), importersSet); } if (importer.getId().equals(defaultImporterId)) { defaultImporter = importer; } } setImporters(defaultImporter); } private void setImporters(final ProjectImporterDescriptor defaultImporter) { new Timer() { @Override public void run() { view.setImporters(importersByCategory); view.selectImporter(defaultImporter != null ? defaultImporter : importersByCategory .get(importersByCategory.keySet().iterator().next()) .iterator().next()); } }.schedule(300); } @Override protected void onFailure(Throwable exception) { notificationManager.notify(locale.failedToImportProject(), FAIL, FLOAT_MODE); } }; projectImportersService.getProjectImporters(appContext.getDevMachine(), callback); } /** {@inheritDoc} */ @Override public void onEnterClicked() { if (enterPressedDelegate != null) { enterPressedDelegate.onEnterKeyPressed(); } } public void setImporterSelectionListener(ImporterSelectionListener listener) { importerSelectionListener = listener; } public interface ImporterSelectionListener { /** Called when importer selected. */ void onImporterSelected(ProjectImporterDescriptor importer); } }