-/*******************************************************************************
- * Copyright (c) 2007, 2009 IBM Corporation and others.
- * 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:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
package eu.etaxonomy.taxeditor.update;
+import java.lang.reflect.InvocationTargetException;
import java.net.URI;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+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.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.equinox.internal.p2.ui.ProvUI;
-import org.eclipse.equinox.internal.p2.ui.dialogs.UpdateSingleIUWizard;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.core.ProvisionException;
+import org.eclipse.equinox.p2.operations.ProvisioningJob;
+import org.eclipse.equinox.p2.operations.ProvisioningSession;
import org.eclipse.equinox.p2.operations.UpdateOperation;
import org.eclipse.equinox.p2.repository.IRepositoryManager;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
-import org.eclipse.equinox.p2.ui.LoadMetadataRepositoryJob;
import org.eclipse.equinox.p2.ui.ProvisioningUI;
-import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import eu.etaxonomy.taxeditor.TaxonomicEditorPlugin;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
/**
* UpdateHandler invokes the check for updates UI
*
- * @since 3.4
*/
-public class UpdateHandler extends PreloadingRepositoryHandler {
-
+public class UpdateHandler extends AbstractHandler {
+ private static final String ERROR_PERFORMING_UPDATES = "Error performing updates";
+ /**
+ * {@inheritDoc}
+ */
@Override
- protected void doExecute(LoadMetadataRepositoryJob job) {
-
- UpdateOperation operation = new UpdateOperation(ProvisioningUI.getDefaultUI().getSession());
-
- // check for updates
- checkForUpdates(operation);
- if (getProvisioningUI().getPolicy().continueWorkingWithOperation(operation, getShell())) {
- if (UpdateSingleIUWizard.validFor(operation)) {
- // Special case for only updating a single root
- UpdateSingleIUWizard wizard = new UpdateSingleIUWizard(getProvisioningUI(), operation);
- WizardDialog dialog = new WizardDialog(getShell(), wizard);
- dialog.create();
- dialog.open();
- } else {
- // Open the normal version of the update wizard
- getProvisioningUI().openUpdateWizard(false, operation, job);
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ // update using a progress monitor
+ IRunnableWithProgress runnable = new IRunnableWithProgress() {
+ @Override
+ public void run(IProgressMonitor monitor) throws InvocationTargetException,
+ InterruptedException {
+ doExecute(monitor);
}
+ };
+
+ try {
+ new ProgressMonitorDialog(null).run(true, true, runnable);
+ } catch (InvocationTargetException | InterruptedException e) {
+ showError(e);
}
+ return null;
}
+ private void doExecute(IProgressMonitor monitor) {
- /**
- * @param monitor
- * @return
- */
- private IStatus checkForUpdates(UpdateOperation operation) {
+ //UpdateOperation operation = new UpdateOperation(ProvisioningUI.getDefaultUI().getSession());
- // force refresh all the caches before
+ BundleContext bundleContext = TaxonomicEditorPlugin.getContext();
+ ServiceReference reference = bundleContext.getServiceReference(IProvisioningAgent.SERVICE_NAME);
+ if (reference == null) {
+ showMessage(MessageDialog.ERROR, ERROR_PERFORMING_UPDATES, "No provisioning agent found. This application is not set up for updates.");
+ return;
+ }
+
+ final IProvisioningAgent agent = (IProvisioningAgent) bundleContext.getService(reference);
+ final IWorkbench workbench = PlatformUI.getWorkbench();
+
+ ProvisioningSession session = new ProvisioningSession(agent);
+ // update all user-visible installable units
+ UpdateOperation operation = new UpdateOperation(session);
+
+ // force refresh all the repository caches before update
IMetadataRepositoryManager metaManager = ProvUI.getMetadataRepositoryManager(ProvisioningUI.getDefaultUI().getSession());
URI[] repos = metaManager.getKnownRepositories(IRepositoryManager.REPOSITORIES_ALL);
+
for(URI repo : repos) {
try {
metaManager.refreshRepository(repo, null);
- } catch (ProvisionException pe) {
- IStatus errorStatus = new Status(IStatus.ERROR, TaxonomicEditorPlugin.PLUGIN_ID,
- "Error occured while reloading cache.", pe);
-
- } catch (OperationCanceledException oce) {
- IStatus errorStatus = new Status(IStatus.ERROR, TaxonomicEditorPlugin.PLUGIN_ID,
- "Error occured while reloading cache.", oce);
+ } catch (ProvisionException | OperationCanceledException e) {
+ showError(e);
}
}
- BundleContext bundleContext = TaxonomicEditorPlugin.getContext();
- ServiceReference reference = bundleContext.getServiceReference(IProvisioningAgent.SERVICE_NAME);
- if (reference == null) {
- IStatus errorStatus = new Status(IStatus.ERROR, TaxonomicEditorPlugin.PLUGIN_ID,
- "No provisioning agent found. This application is not set up for updates.");
- return errorStatus;
+
+ // set location of artifact and metadata repo
+ operation.getProvisioningContext().setArtifactRepositories(repos);
+ operation.getProvisioningContext().setMetadataRepositories(repos);
+
+ IStatus status = operation.resolveModal(monitor);
+
+// if (getProvisioningUI().getPolicy().continueWorkingWithOperation(operation, getShell())) {
+// if (UpdateSingleIUWizard.validFor(operation)) {
+// // Special case for only updating a single root
+// UpdateSingleIUWizard wizard = new UpdateSingleIUWizard(getProvisioningUI(), operation);
+// WizardDialog dialog = new WizardDialog(getShell(), wizard);
+// dialog.create();
+// dialog.open();
+// } else {
+// // Open the normal version of the update wizard
+// getProvisioningUI().openUpdateWizard(false, operation, job);
+// }
+// }
+
+ if (status.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) {
+ showMessage(MessageDialog.INFORMATION, "Checking for updates", "No updates were found");
+ return;
}
- try {
- return operation.resolveModal(null);
- } finally {
- bundleContext.ungetService(reference);
+ final ProvisioningJob provisioningJob = operation.getProvisioningJob(monitor);
+ if (provisioningJob != null) {
+ Display.getDefault().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ boolean performUpdate = MessageDialog.openQuestion(
+ null,
+ "Updates available",
+ "There are updates available. Do you want to install them now?");
+ if (performUpdate) {
+ provisioningJob.addJobChangeListener(new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ if (event.getResult().isOK()) {
+ Display.getDefault().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ boolean restart = MessageDialog.openQuestion(null,
+ "Updates installed, restart?",
+ "Updates have been installed successfully, do you want to restart?");
+ if (restart) {
+ workbench.restart();
+ }
+ }
+ });
+ } else {
+ MessageDialog.openInformation(
+ null,
+ ERROR_PERFORMING_UPDATES,
+ event.getResult().getMessage());
+ }
+ }
+ });
+ provisioningJob.schedule();
+ }
+ }
+ });
+ } else {
+ if (operation.hasResolved()) {
+ showMessage(MessageDialog.ERROR, ERROR_PERFORMING_UPDATES, "Couldn't get provisioning job: " + operation.getResolutionResult());
+ } else {
+ showMessage(MessageDialog.ERROR, ERROR_PERFORMING_UPDATES, "Couldn't resolve provisioning job");
+ }
}
}
+ private void showMessage(final int kind, final String title, final String info) {
+ Display.getDefault().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ MessageDialog.open(kind, null, title, info, SWT.NONE);
+ }
+ });
+ }
+
+ private void showError(final Throwable t) {
+ Display.getDefault().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ MessagingUtils.errorDialog(ERROR_PERFORMING_UPDATES,
+ this,
+ t.getMessage(),
+ TaxonomicEditorPlugin.PLUGIN_ID,
+ t,
+ true);
+ }
+ });
+ }
+
+
}