121 lines
4.1 KiB
Java
121 lines
4.1 KiB
Java
package com.minres.scviewer.e4.application.handlers;
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import java.net.URI;
|
|
import java.net.URISyntaxException;
|
|
|
|
import org.eclipse.core.runtime.IProgressMonitor;
|
|
import org.eclipse.core.runtime.IStatus;
|
|
import org.eclipse.core.runtime.Status;
|
|
import org.eclipse.core.runtime.SubMonitor;
|
|
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
|
|
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
|
|
import org.eclipse.e4.core.di.annotations.Execute;
|
|
import org.eclipse.e4.ui.di.UISynchronize;
|
|
import org.eclipse.e4.ui.workbench.IWorkbench;
|
|
import org.eclipse.equinox.p2.core.IProvisioningAgent;
|
|
import org.eclipse.equinox.p2.operations.ProvisioningJob;
|
|
import org.eclipse.equinox.p2.operations.ProvisioningSession;
|
|
import org.eclipse.equinox.p2.operations.UpdateOperation;
|
|
import org.eclipse.jface.dialogs.MessageDialog;
|
|
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
|
|
import org.eclipse.jface.operation.IRunnableWithProgress;
|
|
|
|
import com.minres.scviewer.e4.application.Messages;
|
|
|
|
public class UpdateHandler {
|
|
|
|
boolean cancelled = false;
|
|
|
|
@Execute
|
|
public void execute(IProvisioningAgent agent, UISynchronize sync, IWorkbench workbench) {
|
|
IRunnableWithProgress runnable = new IRunnableWithProgress() {
|
|
@Override
|
|
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
|
|
update(agent, monitor, sync, workbench);
|
|
}
|
|
};
|
|
try {
|
|
new ProgressMonitorDialog(null).run(true, true, runnable);
|
|
} catch (InvocationTargetException | InterruptedException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
private IStatus update(IProvisioningAgent agent, IProgressMonitor monitor, UISynchronize sync,
|
|
IWorkbench workbench) {
|
|
ProvisioningSession session = new ProvisioningSession(agent);
|
|
UpdateOperation operation = new UpdateOperation(session);
|
|
try {
|
|
operation.getProvisioningContext().setArtifactRepositories(new URI(Messages.UpdateHandler_URI));
|
|
operation.getProvisioningContext().setMetadataRepositories(new URI(Messages.UpdateHandler_URI));
|
|
} catch (URISyntaxException e) {
|
|
}
|
|
SubMonitor sub = SubMonitor.convert(monitor, Messages.UpdateHandler_2, 200);
|
|
IStatus status = operation.resolveModal(sub.newChild(100));
|
|
if (status.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) {
|
|
sync.syncExec(() -> {
|
|
MessageDialog.openInformation(null, Messages.UpdateHandler_10, Messages.UpdateHandler_3);
|
|
});
|
|
return Status.CANCEL_STATUS;
|
|
} else {
|
|
ProvisioningJob provisioningJob = operation.getProvisioningJob(sub.newChild(100));
|
|
if (provisioningJob != null) {
|
|
sync.syncExec(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
boolean performUpdate = MessageDialog.openQuestion(null, Messages.UpdateHandler_4,
|
|
Messages.UpdateHandler_5);
|
|
if (performUpdate) {
|
|
provisioningJob.addJobChangeListener(new JobChangeAdapter() {
|
|
@Override
|
|
public void done(IJobChangeEvent event) {
|
|
if (event.getResult().isOK()) {
|
|
sync.syncExec(new Runnable() {
|
|
|
|
@Override
|
|
public void run() {
|
|
boolean restart = MessageDialog.openQuestion(null,
|
|
Messages.UpdateHandler_6, Messages.UpdateHandler_7);
|
|
if (restart) {
|
|
workbench.restart();
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
sync.syncExec(() -> {
|
|
MessageDialog.openInformation(null, Messages.UpdateHandler_11,
|
|
event.getResult().getMessage());
|
|
});
|
|
cancelled = true;
|
|
}
|
|
}
|
|
});
|
|
provisioningJob.schedule();
|
|
} else {
|
|
cancelled = true;
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
if (operation.hasResolved()) {
|
|
sync.syncExec(() -> {
|
|
MessageDialog.openInformation(null, Messages.UpdateHandler_11,
|
|
Messages.UpdateHandler_8 + operation.getResolutionResult());
|
|
});
|
|
} else {
|
|
sync.syncExec(() -> {
|
|
MessageDialog.openInformation(null, Messages.UpdateHandler_11, Messages.UpdateHandler_9);
|
|
});
|
|
}
|
|
cancelled = true;
|
|
}
|
|
}
|
|
if (cancelled) {
|
|
cancelled = false;
|
|
return Status.CANCEL_STATUS;
|
|
}
|
|
return Status.OK_STATUS;
|
|
}
|
|
}
|