-/**
-* 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.
-*/
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
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.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.JobChangeAdapter;
-import org.eclipse.equinox.internal.p2.ui.ProvUI;
-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.internal.p2.ui.dialogs.UpdateSingleIUWizard;
+import org.eclipse.equinox.p2.operations.RepositoryTracker;
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.ProvisioningUI;
-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;
+import org.eclipse.equinox.p2.ui.LoadMetadataRepositoryJob;
+import org.eclipse.jface.wizard.WizardDialog;
/**
* UpdateHandler invokes the check for updates UI
*
+ * @since 3.4
*/
-public class UpdateHandler extends AbstractHandler {
-
- private static final String ERROR_PERFORMING_UPDATES = "Error performing updates";
- /**
- * {@inheritDoc}
- */
- @Override
- 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) {
-
- //UpdateOperation operation = new UpdateOperation(ProvisioningUI.getDefaultUI().getSession());
-
- 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);
+public class UpdateHandler extends PreloadingRepositoryHandler {
- // force refresh all the repository caches before update
- IMetadataRepositoryManager metaManager = ProvUI.getMetadataRepositoryManager(ProvisioningUI.getDefaultUI().getSession());
- URI[] repos = metaManager.getKnownRepositories(IRepositoryManager.REPOSITORIES_ALL);
+ boolean hasNoRepos = false;
- for(URI repo : repos) {
- try {
- metaManager.refreshRepository(repo, null);
- } catch (ProvisionException | OperationCanceledException e) {
- showError(e);
- }
- }
-
- // 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");
+ @Override
+ protected void doExecute(LoadMetadataRepositoryJob job) {
+ if (hasNoRepos) {
return;
}
-
- 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());
+ UpdateOperation operation = getProvisioningUI().getUpdateOperation(null, null);
+
+
+ // check for updates
+ operation.resolveModal(null);
+ 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 {
- showMessage(MessageDialog.ERROR, ERROR_PERFORMING_UPDATES, "Couldn't resolve provisioning job");
+ // Open the normal version of the update wizard
+ getProvisioningUI().openUpdateWizard(false, operation, 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);
- }
- });
+ @Override
+ protected boolean preloadRepositories() {
+ hasNoRepos = false;
+ RepositoryTracker repoMan = getProvisioningUI().getRepositoryTracker();
+ if (repoMan.getKnownRepositories(getProvisioningUI().getSession()).length == 0) {
+ hasNoRepos = true;
+ return false;
+ }
+ return super.preloadRepositories();
}
-
-
}