/******************************************************************************* * 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.projectimport.local; import com.google.gwt.user.client.ui.FormPanel; import com.google.inject.Inject; import com.google.inject.name.Named; import com.google.web.bindery.event.shared.EventBus; import org.eclipse.che.api.project.gwt.client.ProjectServiceClient; import org.eclipse.che.api.project.shared.dto.ImportResponse; import org.eclipse.che.api.vfs.gwt.client.VfsServiceClient; import org.eclipse.che.api.vfs.shared.dto.Item; import org.eclipse.che.ide.CoreLocalizationConstant; import org.eclipse.che.ide.api.event.OpenProjectEvent; import org.eclipse.che.ide.api.project.wizard.ImportProjectNotificationSubscriber; import org.eclipse.che.ide.dto.DtoFactory; import org.eclipse.che.ide.json.JsonHelper; import org.eclipse.che.ide.rest.AsyncRequestCallback; import org.eclipse.che.ide.ui.dialogs.DialogFactory; import org.eclipse.che.ide.util.NameUtils; import org.eclipse.che.ide.util.loging.Log; import javax.annotation.Nonnull; /** * @author Roman Nikitenko */ public class LocalZipImporterPagePresenter implements LocalZipImporterPageView.ActionDelegate { private CoreLocalizationConstant locale; private LocalZipImporterPageView view; private DtoFactory dtoFactory; private String restContext; private String workspaceId; private final EventBus eventBus; private final VfsServiceClient vfsServiceClient; private final ProjectServiceClient projectServiceClient; private final DialogFactory dialogFactory; private final ImportProjectNotificationSubscriber importProjectNotificationSubscriber; @Inject public LocalZipImporterPagePresenter(LocalZipImporterPageView view, DtoFactory dtoFactory, CoreLocalizationConstant locale, @Named("restContext") String restContext, @Named("workspaceId") String workspaceId, EventBus eventBus, VfsServiceClient vfsServiceClient, ProjectServiceClient projectServiceClient, DialogFactory dialogFactory, ImportProjectNotificationSubscriber importProjectNotificationSubscriber) { this.view = view; this.locale = locale; this.dtoFactory = dtoFactory; this.restContext = restContext; this.workspaceId = workspaceId; this.eventBus = eventBus; this.vfsServiceClient = vfsServiceClient; this.projectServiceClient = projectServiceClient; this.dialogFactory = dialogFactory; this.importProjectNotificationSubscriber = importProjectNotificationSubscriber; this.view.setDelegate(this); } public void show() { updateView(); view.showDialog(); } @Override public void projectNameChanged() { view.setEnabledImportButton(isCompleted()); } @Override public void fileNameChanged() { String projectName = extractProjectName(view.getFileName()); if (!projectName.isEmpty()) { view.setProjectName(projectName); projectNameChanged(); } } @Override public void onSubmitComplete(String result) { try { showProcessing(false); result = extractFromHtmlFormat(result); if (result.isEmpty()) { importFailure(locale.importProjectMessageFailure()); return; } ImportResponse importResponse = dtoFactory.createDtoFromJson(result, ImportResponse.class); if (importResponse.getProjectDescriptor() == null) { importFailure(JsonHelper.parseJsonMessage(result)); return; } importSuccess(importResponse); } catch (Exception e) { importFailure(result); } } @Override public void onCancelClicked() { view.closeDialog(); } @Override public void onImportClicked() { // check on VFS because need to check whether the folder with the same name already exists in the root of workspace final String projectName = view.getProjectName(); vfsServiceClient.getItemByPath(projectName, new AsyncRequestCallback<Item>() { @Override protected void onSuccess(Item result) { view.setEnabledImportButton(false); dialogFactory.createMessageDialog("", locale.createProjectFromTemplateProjectExists(projectName), null).show(); } @Override protected void onFailure(Throwable exception) { importProject(); } }); } private void importProject() { final String projectName = view.getProjectName(); importProjectNotificationSubscriber.subscribe(projectName); view.setEncoding(FormPanel.ENCODING_MULTIPART); view.setAction(restContext + "/project/" + workspaceId + "/upload/zipproject/" + projectName + "?force=false"); view.submit(); showProcessing(true); } private void importSuccess(ImportResponse importResponse) { view.closeDialog(); importProjectNotificationSubscriber.onSuccess(); String projectName = importResponse.getProjectDescriptor().getName(); eventBus.fireEvent(new OpenProjectEvent(projectName)); } private void importFailure(String error) { deleteProject(view.getProjectName()); view.closeDialog(); importProjectNotificationSubscriber.onFailure(error); } /** Updates view from data-object. */ private void updateView() { view.setProjectName(""); view.setProjectDescription(""); view.setProjectVisibility(true); view.setSkipFirstLevel(true); } /** Shown the state that the request is processing. */ private void showProcessing(boolean inProgress) { view.setLoaderVisibility(inProgress); view.setInputsEnableState(!inProgress); } private String extractProjectName(@Nonnull String zipName) { int indexStartProjectName = zipName.lastIndexOf("\\") + 1; int indexFinishProjectName = zipName.indexOf(".zip"); if (indexFinishProjectName != (-1)) { return zipName.substring(indexStartProjectName, indexFinishProjectName); } return ""; } private void deleteProject(final String name) { projectServiceClient.delete(name, new AsyncRequestCallback<Void>() { @Override protected void onSuccess(Void result) { Log.info(LocalZipImporterPagePresenter.class, "Project " + name + " deleted."); } @Override protected void onFailure(Throwable exception) { Log.error(LocalZipImporterPagePresenter.class, exception); } }); } private boolean isProjectNameCorrect() { if (NameUtils.checkProjectName(view.getProjectName())) { view.hideNameError(); return true; } view.showNameError(); return false; } private boolean isCompleted() { return view.getFileName().contains(".zip") && isProjectNameCorrect(); } private String extractFromHtmlFormat(String text) { int beginIndex = -1; int lastIndex = -1; if (text.contains("<pre")) { beginIndex = text.indexOf(">") + 1; lastIndex = text.lastIndexOf("</pre"); } return beginIndex != 0 && lastIndex != -1 ? text.substring(beginIndex, lastIndex) : text; } }