blob: a2241a7b0d5d288c6a53e2d4c63a5c91b403e9b9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2017 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Red Hat Inc. - Bug 460967
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui.sdk.scheduler;
import java.io.IOException;
import java.net.URL;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
import org.eclipse.equinox.internal.provisional.p2.core.eventbus.IProvisioningEventBus;
import org.eclipse.equinox.p2.core.*;
import org.eclipse.equinox.p2.engine.IProfileRegistry;
import org.eclipse.equinox.p2.engine.ProfileScope;
import org.eclipse.equinox.p2.operations.ProvisioningSession;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import org.eclipse.ui.statushandlers.StatusManager;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
/**
* Activator class for the automatic updates plugin. The automatic updates
* plugin is responsible for scheduling background update checks, based on
* update settings specified by end user settings. The implementation of update
* checking is provided by another plugin that provides an IUpdateChecker
* implementation.
*/
public class AutomaticUpdatePlugin extends AbstractUIPlugin {
// bundle-relative icon path
public final static String ICON_PATH = "$nl$/icons/"; //$NON-NLS-1$
// tool icons
public final static String IMG_TOOL_UPDATE = "tool/update.png"; //$NON-NLS-1$
public final static String IMG_TOOL_UPDATE_PROBLEMS = "tool/update_problems.png"; //$NON-NLS-1$
public final static String IMG_TOOL_CLOSE = "tool/close.png"; //$NON-NLS-1$
public final static String IMG_TOOL_CLOSE_HOT = "tool/close_hot.png"; //$NON-NLS-1$
private static AutomaticUpdatePlugin plugin;
private static BundleContext context;
private AutomaticUpdateScheduler scheduler;
private AutomaticUpdater updater;
private ScopedPreferenceStore preferenceStore;
private ProvisioningSession session;
public static final String PLUGIN_ID = "org.eclipse.equinox.p2.ui.sdk.scheduler"; //$NON-NLS-1$
public static BundleContext getContext() {
return context;
}
/**
* Returns the singleton plugin instance
*
* @return the instance
*/
public static AutomaticUpdatePlugin getDefault() {
return plugin;
}
public AutomaticUpdatePlugin() {
// constructor
}
@Override
public void start(BundleContext bundleContext) throws Exception {
super.start(bundleContext);
plugin = this;
context = bundleContext;
}
@Override
public void stop(BundleContext bundleContext) throws Exception {
if (scheduler != null) {
scheduler.shutdown();
scheduler = null;
}
if (updater != null) {
updater.shutdown();
updater = 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<IProvisioningEventBus> busReference = context.getServiceReference(IProvisioningEventBus.class);
if (busReference == null)
return null;
return context.getService(busReference);
}
/*
* Overridden to use a profile scoped preference store.
*/
@Override
public IPreferenceStore getPreferenceStore() {
// Create the preference store lazily.
if (preferenceStore == null) {
final IAgentLocation agentLocation = getAgentLocation();
if (agentLocation == null)
return super.getPreferenceStore();
preferenceStore = new ScopedPreferenceStore(new ProfileScope(agentLocation, IProfileRegistry.SELF),
PLUGIN_ID);
}
return preferenceStore;
}
public IAgentLocation getAgentLocation() {
ServiceReference<IAgentLocation> ref = getContext().getServiceReference(IAgentLocation.class);
if (ref == null)
return null;
IAgentLocation location = getContext().getService(ref);
getContext().ungetService(ref);
return location;
}
public void savePreferences() {
if (preferenceStore != null)
try {
preferenceStore.save();
} catch (IOException e) {
StatusManager.getManager()
.handle(new Status(IStatus.ERROR, AutomaticUpdatePlugin.PLUGIN_ID, 0,
AutomaticUpdateMessages.ErrorSavingPreferences, e),
StatusManager.LOG | StatusManager.SHOW);
}
}
@Override
protected void initializeImageRegistry(ImageRegistry reg) {
createImageDescriptor(IMG_TOOL_UPDATE, reg);
createImageDescriptor(IMG_TOOL_UPDATE_PROBLEMS, reg);
createImageDescriptor(IMG_TOOL_CLOSE, reg);
createImageDescriptor(IMG_TOOL_CLOSE_HOT, reg);
}
/**
* Creates the specified image descriptor and registers it
*/
private void createImageDescriptor(String id, ImageRegistry reg) {
URL url = FileLocator.find(getBundle(), new Path(ICON_PATH).append(id), null);
ImageDescriptor desc = ImageDescriptor.createFromURL(url);
reg.put(id, desc);
}
public ProvisioningSession getSession() {
if (session == null) {
synchronized (this) {
IProvisioningAgent agent = ServiceHelper.getService(getContext(), IProvisioningAgent.class);
session = new ProvisioningSession(agent);
}
}
return session;
}
public IProvisioningAgentProvider getAgentProvider() {
ServiceReference<IProvisioningAgentProvider> ref = getContext()
.getServiceReference(IProvisioningAgentProvider.class);
if (ref == null)
return null;
IProvisioningAgentProvider agentProvider = getContext().getService(ref);
getContext().ungetService(ref);
return agentProvider;
}
}