bug5260: compilable but untested version of an OSGi service registry-based approach for finding subcsription API services

This commit is contained in:
Axel Uhl
2020-11-30 17:44:06 +01:00
parent 9f660a4bd4
commit ba5cebd602
21 changed files with 141 additions and 231 deletions
@@ -21,7 +21,8 @@ Require-Bundle: org.apache.shiro.core;bundle-version="1.2.2",
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
com.sap.sse.replication,
com.sap.sse,
com.sap.sse.security.interface
com.sap.sse.security.interface,
com.sap.sse.security
Export-Package: com.sap.sse.security.userstore.mongodb,
com.sap.sse.security.userstore.mongodb.impl;x-friends:="com.sap.sse.security.storemerging,com.sap.sse.security.test"
Automatic-Module-Name: com.sap.sse.security.userstore.mongodb
@@ -4,19 +4,26 @@ import java.util.logging.Logger;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.util.tracker.ServiceTracker;
import com.sap.sse.ServerInfo;
import com.sap.sse.common.Util;
import com.sap.sse.mongodb.MongoDBService;
import com.sap.sse.security.interfaces.AccessControlStore;
import com.sap.sse.security.interfaces.PreferenceConverterRegistrationManager;
import com.sap.sse.security.interfaces.UserStore;
import com.sap.sse.security.shared.subscription.SubscriptionDataHandler;
import com.sap.sse.security.subscription.SubscriptionApiService;
import com.sap.sse.security.userstore.mongodb.AccessControlStoreImpl;
import com.sap.sse.security.userstore.mongodb.UserStoreImpl;
import com.sap.sse.util.ServiceTrackerFactory;
public class Activator implements BundleActivator {
private static final Logger logger = Logger.getLogger(Activator.class.getName());
private static BundleContext context;
private static ServiceTracker<SubscriptionApiService, SubscriptionApiService> subscriptionApiServiceTracker;
private ServiceRegistration<?> accessControlStoreRegistration;
private ServiceRegistration<?> userStoreRegistration;
private PreferenceConverterRegistrationManager preferenceConverterRegistrationManager;
@@ -24,7 +31,7 @@ public class Activator implements BundleActivator {
static BundleContext getContext() {
return context;
}
/*
* (non-Javadoc)
*
@@ -32,15 +39,13 @@ public class Activator implements BundleActivator {
*/
public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext;
final String defaultServerGroupName = System.getProperty(UserStore.DEFAULT_SERVER_GROUP_NAME_PROPERTY_NAME, ServerInfo.getName() + "-server");
logger.info("Creating user store");
final String defaultServerGroupName = System.getProperty(UserStore.DEFAULT_SERVER_GROUP_NAME_PROPERTY_NAME,
ServerInfo.getName() + "-server");
subscriptionApiServiceTracker = ServiceTrackerFactory.createAndOpen(context, SubscriptionApiService.class);
final UserStoreImpl userStore = new UserStoreImpl(defaultServerGroupName);
AccessControlStoreImpl accessControlStore = new AccessControlStoreImpl(userStore);
accessControlStoreRegistration = context.registerService(AccessControlStore.class.getName(),
accessControlStore, null);
userStoreRegistration = context.registerService(UserStore.class.getName(),
userStore, null);
accessControlStoreRegistration = context.registerService(AccessControlStore.class.getName(), accessControlStore, null);
userStoreRegistration = context.registerService(UserStore.class.getName(), userStore, null);
preferenceConverterRegistrationManager = new PreferenceConverterRegistrationManager(bundleContext, userStore);
logger.info("User store registered.");
for (CollectionNames name : CollectionNames.values()) {
@@ -60,4 +65,15 @@ public class Activator implements BundleActivator {
Activator.context = null;
}
public static SubscriptionDataHandler getSubscriptionDataHandler(String providerName) {
if (subscriptionApiServiceTracker != null) {
ServiceReference<SubscriptionApiService>[] serviceReferences = subscriptionApiServiceTracker.getServiceReferences();
for (final ServiceReference<SubscriptionApiService> serviceReference : serviceReferences) {
if (Util.equalsWithNull(serviceReference.getProperty(SubscriptionApiService.PROVIDER_NAME_OSGI_REGISTRY_KEY), providerName)) {
return context.getService(serviceReference).getDataHandler();
}
}
}
return null;
}
}
@@ -41,11 +41,9 @@ import com.sap.sse.security.shared.impl.Role;
import com.sap.sse.security.shared.impl.User;
import com.sap.sse.security.shared.impl.UserGroup;
import com.sap.sse.security.shared.impl.UserGroupImpl;
import com.sap.sse.security.shared.subscription.InvalidSubscriptionProviderException;
import com.sap.sse.security.shared.subscription.Subscription;
import com.sap.sse.security.shared.subscription.SubscriptionData;
import com.sap.sse.security.shared.subscription.SubscriptionFactory;
import com.sap.sse.security.shared.subscription.SubscriptionProvider;
import com.sap.sse.security.shared.subscription.SubscriptionDataHandler;
import com.sap.sse.security.userstore.mongodb.DomainObjectFactory;
import com.sap.sse.security.userstore.mongodb.impl.FieldNames.Tenant;
@@ -523,14 +521,8 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
data.put(entry.getKey(), entry.getValue());
}
SubscriptionData subscriptionData = new SubscriptionData(data);
try {
final SubscriptionProvider subscriptionProvider = SubscriptionFactory.getInstance()
.getSubscriptionProvider(subscriptionData.getProvider());
subscriptions[i++] = subscriptionProvider.getDataHandler().toSubscription(subscriptionData);
} catch (InvalidSubscriptionProviderException e) {
logger.log(Level.SEVERE, "Failed to load subscription for user " + subscriptionData.getCustomerId(),
e);
}
final SubscriptionDataHandler subscriptionDataHandler = Activator.getSubscriptionDataHandler(subscriptionData.getProviderName());
subscriptions[i++] = subscriptionDataHandler.toSubscription(subscriptionData);
}
} else {
subscriptions = null;
@@ -31,10 +31,8 @@ import com.sap.sse.security.shared.impl.Ownership;
import com.sap.sse.security.shared.impl.Role;
import com.sap.sse.security.shared.impl.User;
import com.sap.sse.security.shared.impl.UserGroup;
import com.sap.sse.security.shared.subscription.InvalidSubscriptionProviderException;
import com.sap.sse.security.shared.subscription.Subscription;
import com.sap.sse.security.shared.subscription.SubscriptionFactory;
import com.sap.sse.security.shared.subscription.SubscriptionProvider;
import com.sap.sse.security.shared.subscription.SubscriptionDataHandler;
import com.sap.sse.security.userstore.mongodb.MongoObjectFactory;
public class MongoObjectFactoryImpl implements MongoObjectFactory {
@@ -42,7 +40,6 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
private final MongoDatabase db;
final MongoCollection<org.bson.Document> settingCollection;
public MongoObjectFactoryImpl(MongoDatabase db) {
this.db = db;
settingCollection = db.getCollection(CollectionNames.PREFERENCES.name());
@@ -342,15 +339,10 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
if (subscriptions != null) {
result = new BasicDBList();
for (final Subscription subscription : subscriptions) {
try {
final Document doc = new Document();
final SubscriptionProvider subscriptionProvider = SubscriptionFactory.getInstance()
.getSubscriptionProvider(subscription.getProvider());
doc.putAll(subscriptionProvider.getDataHandler().toMap(subscription));
result.add(doc);
} catch (InvalidSubscriptionProviderException e) {
logger.log(Level.SEVERE, "Failed to store subscription: " + subscription.toString(), e);
}
final Document doc = new Document();
final SubscriptionDataHandler subscriptionDataHandler = Activator.getSubscriptionDataHandler(subscription.getProviderName());
doc.putAll(subscriptionDataHandler.toMap(subscription));
result.add(doc);
}
} else {
result = null;