Author: angela
Date: Thu Apr  4 15:16:28 2019
New Revision: 1856940

URL: http://svn.apache.org/viewvc?rev=1856940&view=rev
Log:
OAK-8045 : Allow for ranking being specified with UserAuthenticatonFactory 
implementations

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistration.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistrationTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistration.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistration.java?rev=1856940&r1=1856939&r2=1856940&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistration.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistration.java
 Thu Apr  4 15:16:28 2019
@@ -17,11 +17,15 @@
 package org.apache.jackrabbit.oak.security.internal;
 
 import java.io.Closeable;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
 import org.apache.jackrabbit.oak.commons.PropertiesUtil;
 import org.apache.jackrabbit.oak.osgi.OsgiWhiteboard;
 import org.apache.jackrabbit.oak.plugins.tree.RootProvider;
@@ -33,7 +37,6 @@ import org.apache.jackrabbit.oak.securit
 import 
org.apache.jackrabbit.oak.security.user.whiteboard.WhiteboardAuthorizableNodeName;
 import 
org.apache.jackrabbit.oak.security.user.whiteboard.WhiteboardUserAuthenticationFactory;
 import org.apache.jackrabbit.oak.spi.security.CompositeConfiguration;
-import org.apache.jackrabbit.oak.spi.security.ConfigurationBase;
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
 import org.apache.jackrabbit.oak.spi.security.SecurityConfiguration;
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
@@ -61,6 +64,7 @@ import org.apache.jackrabbit.oak.stats.S
 import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -152,7 +156,7 @@ public class SecurityProviderRegistratio
     private final List<AuthorizableNodeName> authorizableNodeNames = 
newCopyOnWriteArrayList();
     private final List<AuthorizableActionProvider> authorizableActionProviders 
= newCopyOnWriteArrayList();
     private final List<RestrictionProvider> restrictionProviders = 
newCopyOnWriteArrayList();
-    private final List<UserAuthenticationFactory> userAuthenticationFactories 
= newCopyOnWriteArrayList();
+    private final SortedMap<ServiceReference, UserAuthenticationFactory> 
userAuthenticationFactories = Collections.synchronizedSortedMap(new 
TreeMap<>());
 
     private RootProvider rootProvider;
     private TreeProvider treeProvider;
@@ -403,19 +407,19 @@ public class SecurityProviderRegistratio
             cardinality = ReferenceCardinality.MULTIPLE,
             policy = ReferencePolicy.DYNAMIC
     )
-    public void bindUserAuthenticationFactory(UserAuthenticationFactory 
userAuthenticationFactory, Map<String, Object> properties) {
+    public void bindUserAuthenticationFactory(@NotNull ServiceReference 
serviceReference, @NotNull UserAuthenticationFactory userAuthenticationFactory) 
{
         synchronized (this) {
-            userAuthenticationFactories.add(userAuthenticationFactory);
-            addCandidate(properties);
+            userAuthenticationFactories.put(serviceReference, 
userAuthenticationFactory);
+            addCandidate(serviceReference);
         }
 
         maybeRegister();
     }
 
-    public void unbindUserAuthenticationFactory(UserAuthenticationFactory 
userAuthenticationFactory, Map<String, Object> properties) {
+    public void unbindUserAuthenticationFactory(@NotNull ServiceReference 
serviceReference, @NotNull UserAuthenticationFactory userAuthenticationFactory) 
{
         synchronized (this) {
-            userAuthenticationFactories.remove(userAuthenticationFactory);
-            removeCandidate(properties);
+            userAuthenticationFactories.remove(serviceReference);
+            removeCandidate(serviceReference);
         }
 
         maybeUnregister();
@@ -600,7 +604,10 @@ public class SecurityProviderRegistratio
 
             @Override
             protected List<UserAuthenticationFactory> getServices() {
-                return newArrayList(userAuthenticationFactories);
+                Collection<UserAuthenticationFactory> values = 
userAuthenticationFactories.values();
+                synchronized (userAuthenticationFactories) {
+                    return newArrayList(values);
+                }
             }
 
         };
@@ -616,6 +623,16 @@ public class SecurityProviderRegistratio
         preconditions.addCandidate(pidOrName);
     }
 
+    private void addCandidate(@NotNull ServiceReference serviceReference) {
+        String pidOrName = getServicePidOrComponentName(serviceReference);
+
+        if (pidOrName == null) {
+            return;
+        }
+
+        preconditions.addCandidate(pidOrName);
+    }
+
     private void removeCandidate(Map<String, Object> properties) {
         String pidOrName = getServicePidOrComponentName(properties);
 
@@ -626,6 +643,16 @@ public class SecurityProviderRegistratio
         preconditions.removeCandidate(pidOrName);
     }
 
+    private void removeCandidate(@NotNull ServiceReference serviceReference) {
+        String pidOrName = getServicePidOrComponentName(serviceReference);
+
+        if (pidOrName == null) {
+            return;
+        }
+
+        preconditions.removeCandidate(pidOrName);
+    }
+
     private static String getServicePidOrComponentName(Map<String, Object> 
properties) {
         String servicePid = 
PropertiesUtil.toString(properties.get(Constants.SERVICE_PID), null);
         if ( servicePid != null ) {
@@ -633,4 +660,12 @@ public class SecurityProviderRegistratio
         }
         return PropertiesUtil.toString(properties.get(OAK_SECURITY_NAME), 
null);
     }
+
+    private static String getServicePidOrComponentName(@NotNull 
ServiceReference serviceReference) {
+        String servicePid = 
PropertiesUtil.toString(serviceReference.getProperty(Constants.SERVICE_PID), 
null);
+        if ( servicePid != null ) {
+            return servicePid;
+        }
+        return 
PropertiesUtil.toString(serviceReference.getProperty(OAK_SECURITY_NAME), null);
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistrationTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistrationTest.java?rev=1856940&r1=1856939&r2=1856940&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistrationTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistrationTest.java
 Thu Apr  4 15:16:28 2019
@@ -18,26 +18,34 @@ package org.apache.jackrabbit.oak.securi
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.SortedMap;
+
 import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import org.apache.jackrabbit.oak.AbstractSecurityTest;
 import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
 import 
org.apache.jackrabbit.oak.security.authorization.AuthorizationConfigurationImpl;
 import 
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration;
+import 
org.apache.jackrabbit.oak.security.authorization.restriction.RestrictionProviderImpl;
 import 
org.apache.jackrabbit.oak.security.authorization.restriction.WhiteboardRestrictionProvider;
 import org.apache.jackrabbit.oak.security.principal.PrincipalConfigurationImpl;
+import org.apache.jackrabbit.oak.security.user.UserAuthenticationFactoryImpl;
 import org.apache.jackrabbit.oak.spi.security.CompositeConfiguration;
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
 import org.apache.jackrabbit.oak.spi.security.Context;
 import org.apache.jackrabbit.oak.spi.security.RegistrationConstants;
 import org.apache.jackrabbit.oak.spi.security.SecurityConfiguration;
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
+import org.apache.jackrabbit.oak.spi.security.authentication.Authentication;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.AuthenticationConfiguration;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.token.CompositeTokenConfiguration;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.token.TokenConfiguration;
@@ -52,18 +60,23 @@ import org.apache.jackrabbit.oak.spi.sec
 import 
org.apache.jackrabbit.oak.spi.security.user.action.AuthorizableActionProvider;
 import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.junit.Rule;
 import org.junit.Test;
-import org.mockito.Mockito;
 import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.component.annotations.Component;
 
+import static 
org.apache.jackrabbit.oak.spi.security.RegistrationConstants.OAK_SECURITY_NAME;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
+import static org.osgi.framework.Constants.SERVICE_PID;
 
 public class SecurityProviderRegistrationTest extends AbstractSecurityTest {
 
@@ -94,7 +107,7 @@ public class SecurityProviderRegistratio
     }
 
     private static <T extends SecurityConfiguration> T 
mockConfiguration(Class<T> cl) {
-        T sc = Mockito.mock(cl);
+        T sc = mock(cl);
         when(sc.getContext()).thenReturn(new ContextImpl());
         when(sc.getParameters()).thenReturn(ConfigurationParameters.EMPTY);
         return sc;
@@ -120,7 +133,7 @@ public class SecurityProviderRegistratio
         SecurityProvider service = context.getService(SecurityProvider.class);
         assertNull(service);
 
-        
registration.bindAuthorizableNodeName(Mockito.mock(AuthorizableNodeName.class), 
ImmutableMap.of(Constants.SERVICE_PID, "serviceId"));
+        
registration.bindAuthorizableNodeName(mock(AuthorizableNodeName.class), 
ImmutableMap.of(SERVICE_PID, "serviceId"));
 
         service = context.getService(SecurityProvider.class);
         assertNotNull(service);
@@ -133,13 +146,13 @@ public class SecurityProviderRegistratio
         SecurityProvider service = context.getService(SecurityProvider.class);
         assertNull(service);
 
-        RestrictionProvider mockRp = Mockito.mock(RestrictionProvider.class);
-        registration.bindRestrictionProvider(mockRp, 
ImmutableMap.of(Constants.SERVICE_PID, "serviceA"));
+        RestrictionProvider mockRp = mock(RestrictionProvider.class);
+        registration.bindRestrictionProvider(mockRp, 
ImmutableMap.of(SERVICE_PID, "serviceA"));
 
         service = context.getService(SecurityProvider.class);
         assertNull(service);
 
-        registration.bindAuthorizationConfiguration(new 
AuthorizationConfigurationImpl(), ImmutableMap.of(Constants.SERVICE_PID, 
"serviceB"));
+        registration.bindAuthorizationConfiguration(new 
AuthorizationConfigurationImpl(), ImmutableMap.of(SERVICE_PID, "serviceB"));
         service = context.getService(SecurityProvider.class);
         assertNotNull(service);
     }
@@ -169,7 +182,7 @@ public class SecurityProviderRegistratio
     public void testModified() {
         registration.activate(context.bundleContext(), 
configWithRequiredServiceIds("rpId", "authorizationId"));
 
-        registration.bindAuthorizationConfiguration(new 
AuthorizationConfigurationImpl(), ImmutableMap.of(Constants.SERVICE_PID, 
"authorizationId"));
+        registration.bindAuthorizationConfiguration(new 
AuthorizationConfigurationImpl(), ImmutableMap.of(SERVICE_PID, 
"authorizationId"));
 
         assertNull(context.getService(SecurityProvider.class));
 
@@ -188,9 +201,9 @@ public class SecurityProviderRegistratio
     public void testModifiedPreconditionStillSatisfied() {
         registration.activate(context.bundleContext(), 
configWithRequiredServiceIds("rpId", "authorizationId"));
 
-        RestrictionProvider mockRp = Mockito.mock(RestrictionProvider.class);
-        registration.bindRestrictionProvider(mockRp, 
ImmutableMap.of(Constants.SERVICE_PID, "rpId"));
-        registration.bindAuthorizationConfiguration(new 
AuthorizationConfigurationImpl(), ImmutableMap.of(Constants.SERVICE_PID, 
"authorizationId"));
+        RestrictionProvider mockRp = mock(RestrictionProvider.class);
+        registration.bindRestrictionProvider(mockRp, 
ImmutableMap.of(SERVICE_PID, "rpId"));
+        registration.bindAuthorizationConfiguration(new 
AuthorizationConfigurationImpl(), ImmutableMap.of(SERVICE_PID, 
"authorizationId"));
 
         SecurityProvider service = context.getService(SecurityProvider.class);
         assertNotNull(service);
@@ -204,8 +217,8 @@ public class SecurityProviderRegistratio
     @Test
     public void testDeactivate() throws Exception {
         registration.activate(context.bundleContext(), 
configWithRequiredServiceIds("nodeName"));
-        AuthorizableNodeName mock = Mockito.mock(AuthorizableNodeName.class);
-        registration.bindAuthorizableNodeName(mock, 
ImmutableMap.of(Constants.SERVICE_PID, "nodeName"));
+        AuthorizableNodeName mock = mock(AuthorizableNodeName.class);
+        registration.bindAuthorizableNodeName(mock, 
ImmutableMap.of(SERVICE_PID, "nodeName"));
 
         SecurityProvider service = context.getService(SecurityProvider.class);
         assertNotNull(service);
@@ -219,8 +232,9 @@ public class SecurityProviderRegistratio
     @Test
     public void testDeactivateWithoutPreconditions() throws Exception {
         registration.activate(context.bundleContext(), 
configWithRequiredServiceIds());
-        UserAuthenticationFactory mock = 
Mockito.mock(UserAuthenticationFactory.class);
-        registration.bindUserAuthenticationFactory(mock, 
ImmutableMap.of(Constants.SERVICE_PID, "nodeName"));
+        UserAuthenticationFactory mock = mock(UserAuthenticationFactory.class);
+        ServiceReference serviceReference = 
when(mock(ServiceReference.class).getProperty(OAK_SECURITY_NAME)).thenReturn("my.custom.uaf").getMock();
+        registration.bindUserAuthenticationFactory(serviceReference, mock);
 
         assertNotNull(context.getService(SecurityProvider.class));
 
@@ -239,8 +253,8 @@ public class SecurityProviderRegistratio
 
         assertFalse(((Preconditions) f.get(registration)).areSatisfied());
 
-        AuthorizableNodeName mock = Mockito.mock(AuthorizableNodeName.class);
-        registration.bindAuthorizableNodeName(mock, 
ImmutableMap.of(Constants.SERVICE_PID, "nodeName"));
+        AuthorizableNodeName mock = mock(AuthorizableNodeName.class);
+        registration.bindAuthorizableNodeName(mock, 
ImmutableMap.of(SERVICE_PID, "nodeName"));
 
         assertTrue(((Preconditions) f.get(registration)).areSatisfied());
 
@@ -257,7 +271,7 @@ public class SecurityProviderRegistratio
         f.setAccessible(true);
 
         TokenConfiguration tc = mockConfiguration(TokenConfiguration.class);
-        registration.bindTokenConfiguration(tc, 
ImmutableMap.of(Constants.SERVICE_PID, "otherServiceId"));
+        registration.bindTokenConfiguration(tc, ImmutableMap.of(SERVICE_PID, 
"otherServiceId"));
 
         Preconditions preconditions = (Preconditions) f.get(registration);
         assertFalse(preconditions.areSatisfied());
@@ -269,13 +283,13 @@ public class SecurityProviderRegistratio
     public void testBindOptionalCandidateAfterRegistration() {
         registration.activate(context.bundleContext(), 
configWithRequiredServiceIds("serviceId"));
 
-        
registration.bindTokenConfiguration(mockConfiguration(TokenConfiguration.class),
 ImmutableMap.of(Constants.SERVICE_PID, "serviceId"));
+        
registration.bindTokenConfiguration(mockConfiguration(TokenConfiguration.class),
 ImmutableMap.of(SERVICE_PID, "serviceId"));
 
         SecurityProvider service = context.getService(SecurityProvider.class);
         assertNotNull(service);
 
         // binding another (optional configuration) must not result in 
re-registration of the service
-        
registration.bindPrincipalConfiguration(mockConfiguration(PrincipalConfiguration.class),
 ImmutableMap.of(Constants.SERVICE_PID, "optionalService"));
+        
registration.bindPrincipalConfiguration(mockConfiguration(PrincipalConfiguration.class),
 ImmutableMap.of(SERVICE_PID, "optionalService"));
 
         SecurityProvider service2 = context.getService(SecurityProvider.class);
         assertSame(service, service2);
@@ -289,7 +303,7 @@ public class SecurityProviderRegistratio
         f.setAccessible(true);
 
         TokenConfiguration tc = mockConfiguration(TokenConfiguration.class);
-        registration.bindTokenConfiguration(tc, 
ImmutableMap.of(Constants.SERVICE_PID, "serviceId"));
+        registration.bindTokenConfiguration(tc, ImmutableMap.of(SERVICE_PID, 
"serviceId"));
 
         Preconditions preconditions = (Preconditions) f.get(registration);
         assertTrue(preconditions.areSatisfied());
@@ -303,13 +317,13 @@ public class SecurityProviderRegistratio
 
         
registration.bindUserConfiguration(mockConfiguration(UserConfiguration.class));
 
-        AuthorizableActionProvider ap = 
Mockito.mock(AuthorizableActionProvider.class);
-        registration.bindAuthorizableActionProvider(ap, 
ImmutableMap.of(Constants.SERVICE_PID, "actionProvider"));
+        AuthorizableActionProvider ap = mock(AuthorizableActionProvider.class);
+        registration.bindAuthorizableActionProvider(ap, 
ImmutableMap.of(SERVICE_PID, "actionProvider"));
 
         SecurityProvider service = context.getService(SecurityProvider.class);
         assertNotNull(service);
 
-        registration.unbindAuthorizableActionProvider(ap, 
ImmutableMap.of(Constants.SERVICE_PID, "actionProvider"));
+        registration.unbindAuthorizableActionProvider(ap, 
ImmutableMap.of(SERVICE_PID, "actionProvider"));
         service = context.getService(SecurityProvider.class);
         assertNull(service);
     }
@@ -321,9 +335,9 @@ public class SecurityProviderRegistratio
         Field f = registration.getClass().getDeclaredField("preconditions");
         f.setAccessible(true);
 
-        AuthorizableNodeName mock = Mockito.mock(AuthorizableNodeName.class);
-        registration.bindAuthorizableNodeName(mock, 
ImmutableMap.of(Constants.SERVICE_PID, "nodeName"));
-        registration.unbindAuthorizableNodeName(mock, 
ImmutableMap.of(Constants.SERVICE_PID, "nodeName"));
+        AuthorizableNodeName mock = mock(AuthorizableNodeName.class);
+        registration.bindAuthorizableNodeName(mock, 
ImmutableMap.of(SERVICE_PID, "nodeName"));
+        registration.unbindAuthorizableNodeName(mock, 
ImmutableMap.of(SERVICE_PID, "nodeName"));
 
         Preconditions preconditions = (Preconditions) f.get(registration);
         assertFalse(preconditions.areSatisfied());
@@ -333,19 +347,20 @@ public class SecurityProviderRegistratio
     public void testUnbindOptionalCandidateAfterRegistration() {
         registration.activate(context.bundleContext(), 
configWithRequiredServiceIds("serviceId"));
 
-        UserAuthenticationFactory uaf = 
Mockito.mock(UserAuthenticationFactory.class);
-        Map<String, Object> properties = 
ImmutableMap.of(Constants.SERVICE_PID, "notMandatory");
-        registration.bindUserAuthenticationFactory(uaf, properties);
+        UserAuthenticationFactory uaf = mock(UserAuthenticationFactory.class);
+        ServiceReference serviceReference = 
when(mock(ServiceReference.class).getProperty(SERVICE_PID)).thenReturn("notMandatory").getMock();
+
+        registration.bindUserAuthenticationFactory(serviceReference, uaf);
 
         assertNull(context.getService(SecurityProvider.class));
 
-        
registration.bindAuthorizableActionProvider(Mockito.mock(AuthorizableActionProvider.class),
 ImmutableMap.of(Constants.SERVICE_PID, "serviceId"));
+        
registration.bindAuthorizableActionProvider(mock(AuthorizableActionProvider.class),
 ImmutableMap.of(SERVICE_PID, "serviceId"));
 
         SecurityProvider service = context.getService(SecurityProvider.class);
         assertNotNull(service);
 
         // unbinding an optional configuration must not result in 
unrregistration of the service
-        registration.unbindUserAuthenticationFactory(uaf, properties);
+        registration.unbindUserAuthenticationFactory(serviceReference, uaf);
 
         SecurityProvider service2 = context.getService(SecurityProvider.class);
         assertSame(service, service2);
@@ -550,8 +565,8 @@ public class SecurityProviderRegistratio
     public void testBindRestrictionProviderWithoutAuthorizationConfig() {
         registration.activate(context.bundleContext(), 
configWithRequiredServiceIds("serviceId"));
 
-        RestrictionProvider mockRp = Mockito.mock(RestrictionProvider.class);
-        registration.bindRestrictionProvider(mockRp, 
ImmutableMap.of(Constants.SERVICE_PID, "serviceId"));
+        RestrictionProvider mockRp = mock(RestrictionProvider.class);
+        registration.bindRestrictionProvider(mockRp, 
ImmutableMap.of(SERVICE_PID, "serviceId"));
 
         SecurityProvider service = context.getService(SecurityProvider.class);
         assertNotNull(service);
@@ -568,9 +583,9 @@ public class SecurityProviderRegistratio
     public void testBindRestrictionProviderWithAuthorizationConfig() {
         registration.activate(context.bundleContext(), 
configWithRequiredServiceIds("rpId", "authorizationId"));
 
-        RestrictionProvider mockRp = Mockito.mock(RestrictionProvider.class);
-        registration.bindRestrictionProvider(mockRp, 
ImmutableMap.of(Constants.SERVICE_PID, "rpId"));
-        registration.bindAuthorizationConfiguration(new 
AuthorizationConfigurationImpl(), ImmutableMap.of(Constants.SERVICE_PID, 
"authorizationId"));
+        RestrictionProvider mockRp = mock(RestrictionProvider.class);
+        registration.bindRestrictionProvider(mockRp, 
ImmutableMap.of(SERVICE_PID, "rpId"));
+        registration.bindAuthorizationConfiguration(new 
AuthorizationConfigurationImpl(), ImmutableMap.of(SERVICE_PID, 
"authorizationId"));
 
         SecurityProvider service = context.getService(SecurityProvider.class);
         RestrictionProvider rp = 
service.getConfiguration(AuthorizationConfiguration.class).getRestrictionProvider();
@@ -584,7 +599,7 @@ public class SecurityProviderRegistratio
         SecurityProvider service = context.getService(SecurityProvider.class);
         assertNull(service);
 
-        
registration.bindAuthorizableNodeName(Mockito.mock(AuthorizableNodeName.class), 
ImmutableMap.of(RegistrationConstants.OAK_SECURITY_NAME, "serviceId"));
+        
registration.bindAuthorizableNodeName(mock(AuthorizableNodeName.class), 
ImmutableMap.of(RegistrationConstants.OAK_SECURITY_NAME, "serviceId"));
 
         service = context.getService(SecurityProvider.class);
         assertNotNull(service);
@@ -594,8 +609,8 @@ public class SecurityProviderRegistratio
     public void testActivateWithMixedServicePiAnddOakServiceName() {
         registration.activate(context.bundleContext(), 
configWithRequiredServiceIds("rpId", "authorizationId"));
         
-        RestrictionProvider mockRp = Mockito.mock(RestrictionProvider.class);
-        registration.bindRestrictionProvider(mockRp, 
ImmutableMap.of(Constants.SERVICE_PID, "rpId"));
+        RestrictionProvider mockRp = mock(RestrictionProvider.class);
+        registration.bindRestrictionProvider(mockRp, 
ImmutableMap.of(SERVICE_PID, "rpId"));
         registration.bindAuthorizationConfiguration(new 
AuthorizationConfigurationImpl(), 
ImmutableMap.of(RegistrationConstants.OAK_SECURITY_NAME, "authorizationId"));
 
         SecurityProvider service = context.getService(SecurityProvider.class);
@@ -603,6 +618,27 @@ public class SecurityProviderRegistratio
         assertTrue(rp instanceof WhiteboardRestrictionProvider);
     }
 
+    @Test
+    public void testMultipleUserAuthenticationFactoriesRespectsRanking() 
throws Exception {
+        context.registerService(SecurityProviderRegistration.class, 
registration, ImmutableMap.of("requiredServicePids", new String[] {"uaf1", 
"uaf2", "uaf3"}));
+
+        UserAuthenticationFactory uaf1 = new UserAuthenticationFactoryImpl();
+        UserAuthenticationFactory uaf2 = new UserAuthenticationFactoryImpl();
+        UserAuthenticationFactory uaf3 = new UserAuthenticationFactoryImpl();
+
+        context.registerInjectActivateService(uaf1, 
ImmutableMap.of(RegistrationConstants.OAK_SECURITY_NAME, "uaf1", 
Constants.SERVICE_RANKING, 50));
+        context.registerInjectActivateService(uaf2, 
ImmutableMap.of(RegistrationConstants.OAK_SECURITY_NAME, "uaf2"));
+        context.registerInjectActivateService(uaf3, 
ImmutableMap.of(RegistrationConstants.OAK_SECURITY_NAME, "uaf3", 
Constants.SERVICE_RANKING, 1));
+
+        Field f = 
registration.getClass().getDeclaredField("userAuthenticationFactories");
+        f.setAccessible(true);
+
+        SortedMap<ServiceReference, UserAuthenticationFactory> m = 
(SortedMap<ServiceReference, UserAuthenticationFactory>) f.get(registration);
+        assertEquals(3, m.size());
+        Collection<UserAuthenticationFactory> c = m.values();
+        assertTrue(Iterables.elementsEqual(ImmutableList.of(uaf2, uaf3, uaf1), 
c));
+    }
+
     private static class ContextImpl implements Context {
 
         @Override


Reply via email to