mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-17 01:31:01 +00:00
PreferenceConverters can now be registered through OSGi service registry
This commit is contained in:
1 parent
f5c359b64e
commit
e89c05bf01
5 files changed
+117
-5
No files matched your search
@@ -7,6 +7,8 @@ package com.sap.sse.security;
|
||||
* @param <PREF> The type of preference object, this converter handles.
|
||||
*/
|
||||
public interface PreferenceConverter<PREF> {
|
||||
public final String KEY_PARAMETER_NAME = "key";
|
||||
|
||||
String toPreferenceString(PREF preference);
|
||||
|
||||
PREF toPreferenceObject(String stringPreference);
|
||||
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
package com.sap.sse.security;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.osgi.framework.BundleContext;
|
||||
import org.osgi.framework.ServiceReference;
|
||||
import org.osgi.util.tracker.ServiceTracker;
|
||||
import org.osgi.util.tracker.ServiceTrackerCustomizer;
|
||||
|
||||
/**
|
||||
* Automatically registers/removes {@link PreferenceConverter} instances found in the OSGi service registry on the given
|
||||
* {@link UserStore}.
|
||||
*
|
||||
* {@link PreferenceConverter} found are required to have a property with the key
|
||||
* {@link PreferenceConverter#KEY_PARAMETER_NAME} defining the preference key the converter should be registered with.
|
||||
*/
|
||||
public class PreferenceConverterRegistrationManager {
|
||||
private static final Logger logger = Logger.getLogger(PreferenceConverterRegistrationManager.class.getName());
|
||||
|
||||
private final BundleContext context;
|
||||
private final UserStore userStore;
|
||||
|
||||
private final ServiceTracker<PreferenceConverter<?>, PreferenceConverter<?>> tracker;
|
||||
|
||||
public PreferenceConverterRegistrationManager(BundleContext bundleContext, UserStore userStore) {
|
||||
this.context = bundleContext;
|
||||
this.userStore = userStore;
|
||||
tracker = createTracker(bundleContext);
|
||||
tracker.open();
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
private ServiceTracker<PreferenceConverter<?>, PreferenceConverter<?>> createTracker(BundleContext bundleContext) {
|
||||
return new ServiceTracker<PreferenceConverter<?>, PreferenceConverter<?>>(bundleContext,
|
||||
(Class) PreferenceConverter.class, new Cutomizer());
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
tracker.close();
|
||||
}
|
||||
|
||||
private class Cutomizer implements ServiceTrackerCustomizer<PreferenceConverter<?>, PreferenceConverter<?>> {
|
||||
|
||||
@Override
|
||||
public PreferenceConverter<?> addingService(ServiceReference<PreferenceConverter<?>> reference) {
|
||||
String preferenceKey = (String) reference.getProperty(PreferenceConverter.KEY_PARAMETER_NAME);
|
||||
PreferenceConverter<?> converter = context.getService(reference);
|
||||
if (preferenceKey == null) {
|
||||
logger.log(Level.SEVERE,
|
||||
"Found PreferenceConverter \"" + converter + "\" in OSGi registry without property "
|
||||
+ PreferenceConverter.KEY_PARAMETER_NAME + " defining the preference key");
|
||||
} else {
|
||||
logger.log(Level.FINE, "Registering PreferenceConverter \"" + converter
|
||||
+ "\" found as OSGi service with key \"" + preferenceKey + "\"");
|
||||
userStore.registerPreferenceConverter(preferenceKey, converter);
|
||||
}
|
||||
return converter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void modifiedService(ServiceReference<PreferenceConverter<?>> reference,
|
||||
PreferenceConverter<?> service) {
|
||||
// Should we do anything here?
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removedService(ServiceReference<PreferenceConverter<?>> reference, PreferenceConverter<?> service) {
|
||||
String preferenceKey = (String) reference.getProperty(PreferenceConverter.KEY_PARAMETER_NAME);
|
||||
if (preferenceKey != null) {
|
||||
logger.log(Level.FINE,
|
||||
"Removing PreferenceConverter \"" + service + "\" with key \"" + preferenceKey + "\"");
|
||||
userStore.removePreferenceConverter(preferenceKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,14 +55,38 @@ public interface UserStore extends Named {
|
||||
String getPreference(String username, String key);
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* In an OSGi environment, this shouldn't be called manually, but instead automatically managed by setting a
|
||||
* {@link PreferenceConverterRegistrationManager} up. {@link PreferenceConverter}s should be registered in the OSGi
|
||||
* service registry with {@link PreferenceConverter#KEY_PARAMETER_NAME} containing the associated preference key
|
||||
* added as property of the service registration.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* Registers a converter objects for a preference key that is used to convert preference Strings to Objects. This
|
||||
* makes it possible to access deserialized settings without the need to do the deserialization over and over again.
|
||||
* </p>
|
||||
*
|
||||
* @param key the key to associate the converter with
|
||||
* @param converter the converter to use for (de)serialization
|
||||
* @param key
|
||||
* the key to associate the converter with
|
||||
* @param converter
|
||||
* the converter to use for (de)serialization
|
||||
*/
|
||||
void registerPreferenceConverter(String key, PreferenceConverter<?> converter);
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* In an OSGi environment, this shouldn't be called manually, but instead automatically managed by setting a
|
||||
* {@link PreferenceConverterRegistrationManager} up.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* Removes a registered {@link PreferenceConverter} with the given key.
|
||||
* </p>
|
||||
*
|
||||
* @param key
|
||||
* the key of the {@link PreferenceConverter} to remove
|
||||
*/
|
||||
void removePreferenceConverter(String key);
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user