Merge pull request #8 from sagarmiglani/SLING-11912

SLING-11912 - Empty configuration in ServiceUserMapperImpl's Required…
diff --git a/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java b/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java
index c8f3a8b..2293a3d 100644
--- a/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java
+++ b/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java
@@ -177,13 +177,8 @@
         this.useDefaultMapping = config.user_enable_default_mapping();
         this.requireValidation = config.require_validation();
 
-        if (config.required_user_validators() != null) {
-            requiredUserValidators.addAll(Arrays.asList(config.required_user_validators()));
-        }
-
-        if (config.required_principal_validators() != null) {
-            requiredPrincipalValidators.addAll(Arrays.asList(config.required_principal_validators()));
-        }
+        requiredUserValidators.addAll(filterEmptyValidatorsConfigs(config.required_user_validators(), "Required User Validators"));
+        requiredPrincipalValidators.addAll(filterEmptyValidatorsConfigs(config.required_principal_validators(), "Required Principal Validators"));
 
         RegistrationSet registrationSet = this.updateMappings();
 
@@ -559,6 +554,23 @@
         return getValidatorsIfPresent(principalsValidators);
     }
 
+    private List<String> filterEmptyValidatorsConfigs(String[] configurations, String configurationName) {
+        List<String> filteredList = new ArrayList<>();
+        if (configurations == null) {
+            return filteredList;
+        }
+
+        for(String config: configurations) {
+            if (config.trim().isEmpty()) {
+                log.warn("Skipped empty value in {} configuration.", configurationName);
+                continue;
+            }
+            filteredList.add(config);
+        }
+
+        return filteredList;
+    }
+
     private <T> List<T> getValidatorsIfPresent(List<T> validators) {
         if (presentUserValidators.containsAll(requiredUserValidators) && presentPrincipalValidators.containsAll(requiredPrincipalValidators)) {
             return validators;
diff --git a/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java b/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java
index 674058e..e029cb0 100644
--- a/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java
+++ b/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java
@@ -50,6 +50,8 @@
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.times;
 
 public class ServiceUserMapperImplTest {
     private static final String BUNDLE_SYMBOLIC1 = "bundle1";
@@ -159,6 +161,36 @@
     }
 
     @Test
+    public void test_emptyRequiredUserAndPrincipalValidators() {
+        ServiceUserMapperImpl.Config config = mock(ServiceUserMapperImpl.Config.class);
+        when(config.require_validation()).thenReturn(true);
+        when(config.required_user_validators()).thenReturn(new String[] {"mockRUV", ""});
+        when(config.required_principal_validators()).thenReturn(new String[] {"mockRPV", ""});
+
+        final ServiceUserMapperImpl mapper = new ServiceUserMapperImpl(null, config);
+
+        List<String> principalNames = Collections.singletonList("bla");
+
+        ServiceUserValidator userValidator = mock(ServiceUserValidator.class);
+        when(userValidator.isValid("alice", "org", "foo")).thenReturn(true);
+        Map<String, Object> properties = new HashMap<>();
+        properties.put(VALIDATOR_ID, "mockRUV");
+        mapper.bindServiceUserValidator(userValidator, properties);
+
+        ServicePrincipalsValidator principalsValidator = mock(ServicePrincipalsValidator.class);
+        when(principalsValidator.isValid(principalNames, "org", "foo")).thenReturn(true);
+        properties.put(VALIDATOR_ID, "mockRPV");
+        mapper.bindServicePrincipalsValidator(principalsValidator, properties);
+
+        // empty validators should be skipped
+        assertTrue(mapper.isValidUser("alice", "org", "foo", true));
+        verify(userValidator, times(1)).isValid("alice", "org", "foo");
+
+        assertTrue(mapper.areValidPrincipals(principalNames, "org", "foo", true));
+        verify(principalsValidator, times(1)).isValid(principalNames,"org", "foo");
+    }
+
+    @Test
     public void test_getServiceUserID() {
         ServiceUserMapperImpl.Config config = mock(ServiceUserMapperImpl.Config.class);
         when(config.user_mapping()).thenReturn(new String[] {