blob: 152bdcb5f6830a4b4092fdd6c398d6d5c181aa73 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2011 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Tasktop Technologies - initial API and implementation
* Peter Stibrany - fixes for bug 220314
*******************************************************************************/
package org.eclipse.mylyn.internal.team.ui.actions;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.patch.ApplyPatchOperation;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.mylyn.commons.core.ICoreRunnable;
import org.eclipse.mylyn.commons.workbench.WorkbenchUtil;
import org.eclipse.mylyn.internal.tasks.ui.AttachmentFileStorage;
import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
import org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin;
import org.eclipse.mylyn.tasks.core.ITaskAttachment;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewActionDelegate;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.BaseSelectionListenerAction;
import org.eclipse.ui.statushandlers.StatusManager;
/**
* @author Mik Kersten
* @author Steffen Pingel
* @author Peter Stibrany
*/
public class ApplyPatchAction extends BaseSelectionListenerAction implements IViewActionDelegate {
private IViewPart viewPart;
public ApplyPatchAction() {
super(Messages.ApplyPatchAction_Apply_Patch);
}
protected ApplyPatchAction(String text) {
super(text);
}
private ISelection currentSelection;
public void init(IViewPart view) {
this.viewPart = view;
}
public void run(IAction action) {
if (currentSelection instanceof StructuredSelection) {
Object object = ((StructuredSelection) currentSelection).getFirstElement();
if (object instanceof ITaskAttachment) {
final ITaskAttachment attachment = (ITaskAttachment) object;
IWorkbenchPart vp = viewPart;
if (vp == null) {
vp = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
}
DownloadAndApplyPatch job = new DownloadAndApplyPatch(Messages.ApplyPatchAction_downloadingPatch,
attachment, vp);
try {
WorkbenchUtil.busyCursorWhile(job);
} catch (CoreException e) {
StatusManager.getManager().handle(e.getStatus());
}
}
}
}
public void selectionChanged(IAction action, ISelection selection) {
this.currentSelection = selection;
}
private static class DownloadAndApplyPatch implements ICoreRunnable {
private final ITaskAttachment attachment;
private final IWorkbenchPart wbPart;
private final String jobName;
public DownloadAndApplyPatch(String jobName, ITaskAttachment attachment, IWorkbenchPart wbPart) {
this.jobName = jobName;
this.attachment = attachment;
this.wbPart = wbPart;
}
public void run(IProgressMonitor monitor) throws CoreException {
monitor.beginTask(jobName, IProgressMonitor.UNKNOWN);
try {
IStatus result = execute(new SubProgressMonitor(monitor, 100));
if (result != null && !result.isOK()) {
throw new CoreException(result);
}
} finally {
monitor.done();
}
}
protected IStatus execute(IProgressMonitor monitor) {
String attachmentFilename = AttachmentUtil.getAttachmentFilename(attachment);
File file = null;
try {
file = File.createTempFile("patch-", ".txt"); //$NON-NLS-1$ //$NON-NLS-2$
} catch (IOException e) {
return new Status(IStatus.ERROR, FocusedTeamUiPlugin.ID_PLUGIN,
Messages.ApplyPatchAction_failedToDownloadPatch, e);
}
file.deleteOnExit();
boolean ok = false;
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
AttachmentUtil.downloadAttachment(attachment, fos, monitor);
ok = true;
} catch (IOException e) {
return new Status(IStatus.ERROR, FocusedTeamUiPlugin.ID_PLUGIN,
Messages.ApplyPatchAction_failedToDownloadPatch, e);
} catch (CoreException e) {
int s = IStatus.ERROR;
if (e.getStatus() != null && e.getStatus().getCode() == IStatus.CANCEL) {
throw new OperationCanceledException();
}
return new Status(s, FocusedTeamUiPlugin.ID_PLUGIN, Messages.ApplyPatchAction_failedToDownloadPatch, e);
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
if (ok) {
// report this exception if there was no other problem until now ... we will not work with file
// which cannot be closed properly, because this indicates some problem
file.delete();
return new Status(IStatus.ERROR, FocusedTeamUiPlugin.ID_PLUGIN,
Messages.ApplyPatchAction_failedToDownloadPatch, e);
}
}
}
if (!ok) {
file.delete();
}
}
IWorkbenchPartSite site = wbPart.getSite();
if (site == null) {
return new Status(IStatus.WARNING, FocusedTeamUiPlugin.ID_PLUGIN,
Messages.ApplyPatchAction_cannotApplyPatch);
}
final Display disp = site.getWorkbenchWindow().getWorkbench().getDisplay();
if (disp.isDisposed()) {
return new Status(IStatus.WARNING, FocusedTeamUiPlugin.ID_PLUGIN,
Messages.ApplyPatchAction_cannotApplyPatch);
}
final AttachmentFileStorage fileStorage = new AttachmentFileStorage(file, attachmentFilename);
disp.asyncExec(new Runnable() {
public void run() {
ApplyPatchOperation op = new ApplyPatchOperation(wbPart, fileStorage, null,
new CompareConfiguration());
BusyIndicator.showWhile(disp, op);
}
});
return Status.OK_STATUS;
}
}
}