/******************************************************************************* * Copyright (c) 2012-2015 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.projecttype.wizard; import org.eclipse.che.api.core.rest.shared.dto.ServiceError; import org.eclipse.che.api.project.gwt.client.ProjectServiceClient; import org.eclipse.che.api.project.shared.dto.ImportProject; import org.eclipse.che.api.project.shared.dto.ImportResponse; import org.eclipse.che.api.project.shared.dto.NewProject; import org.eclipse.che.api.project.shared.dto.ProjectDescriptor; import org.eclipse.che.ide.CoreLocalizationConstant; import org.eclipse.che.ide.CoreLocalizationConstant; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.event.OpenProjectEvent; import org.eclipse.che.ide.api.event.RefreshProjectTreeEvent; import org.eclipse.che.ide.api.project.type.wizard.ProjectWizardMode; import org.eclipse.che.ide.api.wizard.AbstractWizard; import org.eclipse.che.ide.dto.DtoFactory; 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.ui.dialogs.DialogFactory; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; import com.google.web.bindery.event.shared.EventBus; import javax.annotation.Nonnull; import static org.eclipse.che.ide.api.project.type.wizard.ProjectWizardMode.CREATE; import static org.eclipse.che.ide.api.project.type.wizard.ProjectWizardMode.CREATE_MODULE; import static org.eclipse.che.ide.api.project.type.wizard.ProjectWizardMode.IMPORT; import static org.eclipse.che.ide.api.project.type.wizard.ProjectWizardMode.UPDATE; import static org.eclipse.che.ide.api.project.type.wizard.ProjectWizardRegistrar.PROJECT_NAME_KEY; import static org.eclipse.che.ide.api.project.type.wizard.ProjectWizardRegistrar.PROJECT_PATH_KEY; import static org.eclipse.che.ide.api.project.type.wizard.ProjectWizardRegistrar.WIZARD_MODE_KEY; /** * Project wizard used for creating new a project or updating an existing one. * * @author Artem Zatsarynnyy */ public class ProjectWizard extends AbstractWizard<ImportProject> { private final ProjectWizardMode mode; private final CoreLocalizationConstant localizationConstants; private final ProjectServiceClient projectServiceClient; private final DtoUnmarshallerFactory dtoUnmarshallerFactory; private final DtoFactory dtoFactory; private final DialogFactory dialogFactory; private final EventBus eventBus; private final AppContext appContext; /** * Creates project wizard. * * @param dataObject * wizard's data-object * @param mode * mode of project wizard * @param projectPath * path to the project to update if wizard created in {@link ProjectWizardMode#UPDATE} mode * or path to the folder to convert it to module if wizard created in {@link ProjectWizardMode#CREATE_MODULE} mode * @param localizationConstants * localization constants * @param projectServiceClient * GWT-client for Project service * @param dtoUnmarshallerFactory * {@link org.eclipse.che.ide.rest.DtoUnmarshallerFactory} instance * @param dialogFactory * {@link org.eclipse.che.ide.ui.dialogs.DialogFactory} instance * @param eventBus * {@link com.google.web.bindery.event.shared.EventBus} instance * @param appContext * {@link org.eclipse.che.ide.api.app.AppContext} instance */ @Inject public ProjectWizard(@Assisted ImportProject dataObject, @Assisted ProjectWizardMode mode, @Assisted String projectPath, CoreLocalizationConstant localizationConstants, ProjectServiceClient projectServiceClient, DtoUnmarshallerFactory dtoUnmarshallerFactory, DtoFactory dtoFactory, DialogFactory dialogFactory, EventBus eventBus, AppContext appContext) { super(dataObject); this.mode = mode; this.localizationConstants = localizationConstants; this.projectServiceClient = projectServiceClient; this.dtoUnmarshallerFactory = dtoUnmarshallerFactory; this.dtoFactory = dtoFactory; this.dialogFactory = dialogFactory; this.eventBus = eventBus; this.appContext = appContext; context.put(WIZARD_MODE_KEY, mode.toString()); context.put(PROJECT_NAME_KEY, dataObject.getProject().getName()); if (mode == UPDATE || mode == CREATE_MODULE) { context.put(PROJECT_PATH_KEY, projectPath); } } /** {@inheritDoc} */ @Override public void complete(@Nonnull final CompleteCallback callback) { if (mode == CREATE) { createProject(callback); } else if (mode == CREATE_MODULE) { createModule(callback); } else if (mode == UPDATE) { updateProject(callback); } else if (mode == IMPORT) { importProject(callback); } } private void createProject(final CompleteCallback callback) { final NewProject project = dataObject.getProject(); final Unmarshallable<ProjectDescriptor> unmarshaller = dtoUnmarshallerFactory.newUnmarshaller(ProjectDescriptor.class); projectServiceClient.createProject(project.getName(), project, new AsyncRequestCallback<ProjectDescriptor>(unmarshaller) { @Override protected void onSuccess(ProjectDescriptor result) { eventBus.fireEvent(new OpenProjectEvent(result.getName())); callback.onCompleted(); } @Override protected void onFailure(Throwable exception) { final String message = dtoFactory.createDtoFromJson(exception.getMessage(), ServiceError.class).getMessage(); callback.onFailure(new Exception(message)); } }); } private void createModule(final CompleteCallback callback) { final String parentPath = appContext.getCurrentProject().getRootProject().getPath(); final String modulePath = context.get(PROJECT_PATH_KEY); final NewProject project = dataObject.getProject(); final Unmarshallable<ProjectDescriptor> unmarshaller = dtoUnmarshallerFactory.newUnmarshaller(ProjectDescriptor.class); projectServiceClient.createModule( parentPath, modulePath, project, new AsyncRequestCallback<ProjectDescriptor>(unmarshaller) { @Override protected void onSuccess(ProjectDescriptor result) { eventBus.fireEvent(new RefreshProjectTreeEvent()); callback.onCompleted(); } @Override protected void onFailure(Throwable exception) { callback.onFailure(exception); } }); } private void importProject(final CompleteCallback callback) { final NewProject project = dataObject.getProject(); final Unmarshallable<ImportResponse> unmarshaller = dtoUnmarshallerFactory.newUnmarshaller(ImportResponse.class); projectServiceClient.importProject( project.getName(), true, dataObject, new AsyncRequestCallback<ImportResponse>(unmarshaller) { @Override protected void onSuccess(ImportResponse result) { eventBus.fireEvent(new OpenProjectEvent(result.getProjectDescriptor().getName())); callback.onCompleted(); } @Override protected void onFailure(Throwable exception) { final String message = dtoFactory.createDtoFromJson(exception.getMessage(), ServiceError.class).getMessage(); callback.onFailure(new Exception(message)); } }); } private void updateProject(final CompleteCallback callback) { final NewProject project = dataObject.getProject(); final String currentName = context.get(PROJECT_NAME_KEY); if (currentName.equals(project.getName())) { doUpdateProject(callback); } else { renameProject(new AsyncCallback<Void>() { @Override public void onSuccess(Void result) { doUpdateProject(callback); } @Override public void onFailure(Throwable caught) { final String message = dtoFactory.createDtoFromJson(caught.getMessage(), ServiceError.class).getMessage(); callback.onFailure(new Exception(message)); } }); } } private void doUpdateProject(final CompleteCallback callback) { final NewProject project = dataObject.getProject(); final Unmarshallable<ProjectDescriptor> unmarshaller = dtoUnmarshallerFactory.newUnmarshaller(ProjectDescriptor.class); projectServiceClient.updateProject(project.getName(), project, new AsyncRequestCallback<ProjectDescriptor>(unmarshaller) { @Override protected void onSuccess(ProjectDescriptor result) { // just re-open project if it's already opened eventBus.fireEvent(new OpenProjectEvent(result.getName())); callback.onCompleted(); } @Override protected void onFailure(Throwable exception) { final String message = dtoFactory.createDtoFromJson(exception.getMessage(), ServiceError.class).getMessage(); callback.onFailure(new Exception(message)); } }); } private void renameProject(final AsyncCallback<Void> callback) { final String path = context.get(PROJECT_PATH_KEY); projectServiceClient.rename(path, dataObject.getProject().getName(), null, new AsyncRequestCallback<Void>() { @Override protected void onSuccess(Void result) { callback.onSuccess(result); } @Override protected void onFailure(Throwable exception) { callback.onFailure(exception); } }); } }