blob: 96b2874b0f7fa4bf728aa2c12cb3f88e9dc19f3d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 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 org.eclipse.equinox.internal.p2.ui.sdk.scheduler;
import java.io.IOException;
import org.eclipse.equinox.internal.provisional.p2.core.eventbus.IProvisioningEventBus;
import org.eclipse.equinox.internal.provisional.p2.engine.IProfileRegistry;
import org.eclipse.equinox.internal.provisional.p2.engine.ProfileScope;
import org.eclipse.equinox.internal.provisional.p2.ui.ProvUI;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import org.eclipse.ui.statushandlers.StatusManager;
import org.osgi.framework.*;
import org.osgi.service.packageadmin.PackageAdmin;
/**
* Activator class for the automatic updates plugin
*/
public class AutomaticUpdatePlugin extends AbstractUIPlugin {
private static AutomaticUpdatePlugin plugin;
private static BundleContext context;
private static PackageAdmin packageAdmin = null;
private static ServiceReference packageAdminRef = null;
private AutomaticUpdateScheduler scheduler;
private AutomaticUpdater updater;
private ScopedPreferenceStore preferenceStore;
public static final String PLUGIN_ID = "org.eclipse.equinox.p2.ui.sdk.scheduler"; //$NON-NLS-1$
public static BundleContext getContext() {
return context;
}
public static Bundle getBundle(String symbolicName) {
if (packageAdmin == null)
return null;
Bundle[] bundles = packageAdmin.getBundles(symbolicName, null);
if (bundles == null)
return null;
// Return the first bundle that is not installed or uninstalled
for (int i = 0; i < bundles.length; i++) {
if ((bundles[i].getState() & (Bundle.INSTALLED | Bundle.UNINSTALLED)) == 0) {
return bundles[i];
}
}
return null;
}
/**
* Returns the singleton plugin instance
*
* @return the instance
*/
public static AutomaticUpdatePlugin getDefault() {
return plugin;
}
public AutomaticUpdatePlugin() {
// constructor
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext
* )
*/
public void start(BundleContext bundleContext) throws Exception {
super.start(bundleContext);
plugin = this;
context = bundleContext;
packageAdminRef = bundleContext.getServiceReference(PackageAdmin.class.getName());
packageAdmin = (PackageAdmin) bundleContext.getService(packageAdminRef);
// TODO for now we need to manually start up the provisioning
// infrastructure and the update checker, because the Eclipse
// Application launch config won't let me specify bundles to start.
// TODO how should we react if we are unable to start one of these bundles?
startEarly("org.eclipse.equinox.p2.exemplarysetup"); //$NON-NLS-1$
startEarly("org.eclipse.equinox.frameworkadmin.equinox"); //$NON-NLS-1$
startEarly("org.eclipse.equinox.simpleconfigurator.manipulator"); //$NON-NLS-1$
startEarly("org.eclipse.equinox.p2.updatechecker"); //$NON-NLS-1$
PreferenceInitializer.migratePreferences();
}
private boolean startEarly(String bundleName) throws BundleException {
Bundle bundle = getBundle(bundleName);
if (bundle == null)
return false;
bundle.start(Bundle.START_TRANSIENT);
return true;
}
public void stop(BundleContext bundleContext) throws Exception {
if (scheduler != null) {
scheduler.shutdown();
scheduler = null;
}
if (updater != null) {
updater.shutdown();
updater = null;
}
packageAdmin = null;
packageAdminRef = null;
plugin = null;
super.stop(bundleContext);
context = null;
}
public AutomaticUpdateScheduler getScheduler() {
// If the scheduler was disabled, it does not get initialized
if (scheduler == null)
scheduler = new AutomaticUpdateScheduler();
return scheduler;
}
public AutomaticUpdater getAutomaticUpdater() {
if (updater == null)
updater = new AutomaticUpdater();
return updater;
}
void setScheduler(AutomaticUpdateScheduler scheduler) {
this.scheduler = scheduler;
}
public IProvisioningEventBus getProvisioningEventBus() {
ServiceReference busReference = context.getServiceReference(IProvisioningEventBus.SERVICE_NAME);
if (busReference == null)
return null;
return (IProvisioningEventBus) context.getService(busReference);
}
/*
* Overridden to use a profile scoped preference store. (non-Javadoc)
*
* @see org.eclipse.ui.plugin.AbstractUIPlugin#getPreferenceStore()
*/
public IPreferenceStore getPreferenceStore() {
// Create the preference store lazily.
if (preferenceStore == null) {
preferenceStore = new ScopedPreferenceStore(new ProfileScope(IProfileRegistry.SELF), PLUGIN_ID);
}
return preferenceStore;
}
public void savePreferences() {
if (preferenceStore != null)
try {
preferenceStore.save();
} catch (IOException e) {
ProvUI.handleException(e, AutomaticUpdateMessages.ErrorSavingPreferences, StatusManager.LOG | StatusManager.SHOW);
}
}
}