PreferenceConverters can now be registered through OSGi service registry

This commit is contained in:
Steffen Schaefer committed 2016-07-11 12:38:14 +02:00
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);
@@ -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);
/**