/******************************************************************************* * 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.upload.file; import com.google.common.base.Optional; import com.google.gwt.user.client.ui.FormPanel; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.web.bindery.event.shared.EventBus; import org.eclipse.che.api.promises.client.Operation; import org.eclipse.che.api.promises.client.OperationException; import org.eclipse.che.ide.CoreLocalizationConstant; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.editor.EditorAgent; import org.eclipse.che.ide.api.notification.Notification; import org.eclipse.che.ide.api.notification.NotificationListener; import org.eclipse.che.ide.api.notification.NotificationManager; import org.eclipse.che.ide.api.notification.StatusNotification; import org.eclipse.che.ide.api.resources.Container; import org.eclipse.che.ide.api.resources.File; import org.eclipse.che.ide.resource.Path; import org.eclipse.che.ide.resources.reveal.RevealResourceEvent; import static com.google.common.base.Strings.isNullOrEmpty; import static org.eclipse.che.ide.api.notification.StatusNotification.DisplayMode.FLOAT_MODE; /** * The purpose of this class is upload file * * @author Roman Nikitenko * @author Vlad Zhukovskyi */ @Singleton public class UploadFilePresenter implements UploadFileView.ActionDelegate { private final UploadFileView view; private final AppContext appContext; private final EventBus eventBus; private final NotificationManager notificationManager; private final EditorAgent editorAgent; private final CoreLocalizationConstant locale; private Container container; @Inject public UploadFilePresenter(UploadFileView view, AppContext appContext, EventBus eventBus, NotificationManager notificationManager, CoreLocalizationConstant locale, EditorAgent editorAgent) { this.appContext = appContext; this.eventBus = eventBus; this.view = view; this.locale = locale; this.notificationManager = notificationManager; this.editorAgent = editorAgent; this.view.setDelegate(this); this.view.setEnabledUploadButton(false); this.view.setEncoding(FormPanel.ENCODING_MULTIPART); } /** Show dialog. */ public void showDialog(Container container) { this.container = container; view.showDialog(); view.setAction(appContext.getDevMachine().getWsAgentBaseUrl() + "/project/uploadfile" + container.getLocation()); } /** {@inheritDoc} */ @Override public void onCancelClicked() { view.closeDialog(); } /** {@inheritDoc} */ @Override public void onSubmitComplete(String result) { if (!isNullOrEmpty(result)) { view.closeDialog(); notificationManager.notify(locale.failedToUploadFiles(), parseMessage(result), StatusNotification.Status.FAIL, FLOAT_MODE); return; } container.getFile(Path.valueOf(view.getFileName())).then(new Operation<Optional<File>>() { @Override public void apply(final Optional<File> file) throws OperationException { if (file.isPresent()) { eventBus.fireEvent(new RevealResourceEvent(file.get())); final NotificationListener notificationListener = new NotificationListener() { boolean clicked = false; @Override public void onClick(Notification notification) { if (!clicked) { editorAgent.openEditor(file.get()); clicked = true; notification.setListener(null); notification.setContent(""); } } @Override public void onDoubleClick(Notification notification) { //stub } @Override public void onClose(Notification notification) { //stub } }; notificationManager.notify("File '" + view.getFileName() + "' has uploaded successfully", "Click here to open it", StatusNotification.Status.SUCCESS, FLOAT_MODE, notificationListener); view.closeDialog(); } } }); //TODO this should process editor agent // if (view.isOverwriteFileSelected()) { // String path = ((HasStorablePath)getResourceBasedNode()).getStorablePath() + "/" + view.getFileName(); // eventBus.fireEvent(new FileContentUpdateEvent(path)); // } } /** {@inheritDoc} */ @Override public void onUploadClicked() { view.submit(); } /** {@inheritDoc} */ @Override public void onFileNameChanged() { String fileName = view.getFileName(); boolean enabled = !fileName.isEmpty(); view.setEnabledUploadButton(enabled); } private String parseMessage(String message) { int startIndex = 0; int endIndex = -1; if (message.contains("<pre>message:")) { startIndex = message.indexOf("<pre>message:") + "<pre>message:".length(); } else if (message.contains("<pre>")) { startIndex = message.indexOf("<pre>") + "<pre>".length(); } if (message.contains("</pre>")) { endIndex = message.indexOf("</pre>"); } return (endIndex != -1) ? message.substring(startIndex, endIndex) : message.substring(startIndex); } }