Copyright (c) 2004, 2015 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
Danail Nachev (ProSyst) - bug 188070
/*******************************************************************************
* Copyright (c) 2004, 2015 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
* Danail Nachev (ProSyst) - bug 188070
*******************************************************************************/
package org.eclipse.core.internal.preferences;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.core.runtime.preferences.ConfigurationScope;
import org.osgi.framework.*;
import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences;
Class used to manage OSGi Preferences Service. Creates a new OSGiPreferencesServiceImpl
object for every bundle that gets the Preferences Service. When a bundle ungets the
Preference Service, it's preferences are flushed to disk.
Also deletes saved preferences for bundles which are uninstalled.
/**
* <p>
* Class used to manage OSGi Preferences Service. Creates a new OSGiPreferencesServiceImpl
* object for every bundle that gets the Preferences Service. When a bundle ungets the
* Preference Service, it's preferences are flushed to disk.
* </p>
* <p>
* Also deletes saved preferences for bundles which are uninstalled.
* </p>
*/
public class OSGiPreferencesServiceManager implements ServiceFactory<org.osgi.service.prefs.PreferencesService>, BundleListener {
private static final String ORG_ECLIPSE_CORE_INTERNAL_PREFERENCES_OSGI = "org.eclipse.core.internal.preferences.osgi"; //$NON-NLS-1$
//keys are bundles that use OSGi prefs
private Preferences prefBundles;
public OSGiPreferencesServiceManager(BundleContext context) {
context.addBundleListener(this);
//prefBundles = new InstanceScope().getNode(ORG_ECLIPSE_CORE_INTERNAL_PREFERENCES_OSGI);
prefBundles = ConfigurationScope.INSTANCE.getNode(ORG_ECLIPSE_CORE_INTERNAL_PREFERENCES_OSGI);
//clean up prefs for bundles that have been uninstalled
try {
//get list of currently installed bundles
Bundle[] allBundles = context.getBundles();
Set<String> bundleQualifiers = new TreeSet<>();
for (Bundle allBundle : allBundles) {
bundleQualifiers.add(getQualifier(allBundle));
}
//get list of bundles we created prefs for
String[] prefsBundles = prefBundles.keys();
//remove prefs nodes for bundles that are no longer installed
for (String prefsBundle : prefsBundles) {
if (!bundleQualifiers.contains(prefsBundle)) {
removePrefs(prefsBundle);
}
}
} catch (BackingStoreException e) {
//best effort
}
}
Creates a new OSGiPreferencesServiceImpl for each bundle.
/**
* Creates a new OSGiPreferencesServiceImpl for each bundle.
*/
@Override
public org.osgi.service.prefs.PreferencesService getService(Bundle bundle, ServiceRegistration<org.osgi.service.prefs.PreferencesService> registration) {
String qualifier = getQualifier(bundle);
//remember we created prefs for this bundle
Preferences bundlesNode = getBundlesNode();
bundlesNode.put(qualifier, ""); //$NON-NLS-1$
try {
bundlesNode.flush();
} catch (BackingStoreException e) {
//best effort
}
//return new OSGiPreferencesServiceImpl(new InstanceScope().getNode(getQualifier(bundle)));
return new OSGiPreferencesServiceImpl(ConfigurationScope.INSTANCE.getNode(getQualifier(bundle)));
}
Store preferences per bundle id
/**
* Store preferences per bundle id
*/
private String getQualifier(Bundle bundle) {
String qualifier = "org.eclipse.core.runtime.preferences.OSGiPreferences." + bundle.getBundleId(); //$NON-NLS-1$
return qualifier;
}
Flush the bundle's preferences.
/**
* Flush the bundle's preferences.
*/
@Override
public void ungetService(Bundle bundle, ServiceRegistration<org.osgi.service.prefs.PreferencesService> registration, org.osgi.service.prefs.PreferencesService service) {
try {
//new InstanceScope().getNode(getQualifier(bundle)).flush();
ConfigurationScope.INSTANCE.getNode(getQualifier(bundle)).flush();
} catch (BackingStoreException e) {
//best effort
}
}
If a bundle is uninstalled, delete all of it's preferences from the disk.
/**
* If a bundle is uninstalled, delete all of it's preferences from the disk.
*/
@Override
public void bundleChanged(BundleEvent event) {
if (event.getType() == BundleEvent.UNINSTALLED) {
try {
removePrefs(getQualifier(event.getBundle()));
} catch (BackingStoreException e) {
//best effort
}
}
}
protected void removePrefs(String qualifier) throws BackingStoreException {
//remove bundle's prefs
//new InstanceScope().getNode(qualifier).removeNode();
ConfigurationScope.INSTANCE.getNode(qualifier).removeNode();
//remove from our list of bundles with prefs
Preferences bundlesNode = getBundlesNode();
bundlesNode.remove(qualifier);
bundlesNode.flush();
}
private Preferences getBundlesNode() {
try {
if (prefBundles == null || !prefBundles.nodeExists("")) { //$NON-NLS-1$
prefBundles = ConfigurationScope.INSTANCE.getNode(ORG_ECLIPSE_CORE_INTERNAL_PREFERENCES_OSGI);
}
return prefBundles;
} catch (BackingStoreException e) {
// ignore
}
return null;
}
}