Author: cziegeler Date: Thu Apr 6 06:03:13 2017 New Revision: 1790344 URL: http://svn.apache.org/viewvc?rev=1790344&view=rev Log: SLING-6772 : Provide default mapping for service users
Modified: sling/trunk/bundles/extensions/serviceusermapper/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java sling/trunk/bundles/extensions/serviceusermapper/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java Modified: sling/trunk/bundles/extensions/serviceusermapper/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/serviceusermapper/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java?rev=1790344&r1=1790343&r2=1790344&view=diff ============================================================================== --- sling/trunk/bundles/extensions/serviceusermapper/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java (original) +++ sling/trunk/bundles/extensions/serviceusermapper/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java Thu Apr 6 06:03:13 2017 @@ -72,8 +72,14 @@ public class ServiceUserMapperImpl imple @AttributeDefinition(name = "Default User", description = "The name of the user to use as the default if no service mapping" - + "applies. If this property is missing or empty no default user is defined.") + + " applies. If this property is missing or empty no default user is defined.") String user_default(); + + @AttributeDefinition(name = "Default Mapping", + description = "If enabled and no mapping for a requested service user exists and no " + + " default user is defined, a " + + "default mapping is applied which uses the service user \"serviceuser@\" + {bundleId} + [\":\" + subServiceName]") + boolean user_default_mapping() default true; } /** default log */ @@ -83,13 +89,15 @@ public class ServiceUserMapperImpl imple private String defaultUser; - private Map<Long, MappingConfigAmendment> amendments = new HashMap<Long, MappingConfigAmendment>(); + private boolean useDefaultMapping; + + private Map<Long, MappingConfigAmendment> amendments = new HashMap<>(); private Mapping[] activeMappings = new Mapping[0]; - private final List<ServiceUserValidator> validators = new CopyOnWriteArrayList<ServiceUserValidator>(); + private final List<ServiceUserValidator> validators = new CopyOnWriteArrayList<>(); - private SortedMap<Mapping, Registration> activeRegistrations = new TreeMap<Mapping, Registration>(); + private SortedMap<Mapping, Registration> activeRegistrations = new TreeMap<>(); private BundleContext bundleContext; @@ -107,7 +115,7 @@ public class ServiceUserMapperImpl imple final String[] props = config.user_mapping(); if ( props != null ) { - final ArrayList<Mapping> mappings = new ArrayList<Mapping>(props.length); + final ArrayList<Mapping> mappings = new ArrayList<>(props.length); for (final String prop : props) { if (prop != null && prop.trim().length() > 0 ) { try { @@ -124,6 +132,7 @@ public class ServiceUserMapperImpl imple this.globalServiceUserMappings = new Mapping[0]; } this.defaultUser = config.user_default(); + this.useDefaultMapping = config.user_default_mapping(); RegistrationSet registrationSet = null; this.bundleContext = bundleContext; @@ -208,13 +217,13 @@ public class ServiceUserMapperImpl imple } protected RegistrationSet updateMappings() { - final List<MappingConfigAmendment> sortedMappings = new ArrayList<MappingConfigAmendment>(); + final List<MappingConfigAmendment> sortedMappings = new ArrayList<>(); for(final MappingConfigAmendment amendment : this.amendments.values() ) { sortedMappings.add(amendment); } Collections.sort(sortedMappings); - final List<Mapping> mappings = new ArrayList<Mapping>(); + final List<Mapping> mappings = new ArrayList<>(); for(final Mapping m : this.globalServiceUserMappings) { mappings.add(m); } @@ -242,8 +251,8 @@ public class ServiceUserMapperImpl imple return result; } - final SortedSet<Mapping> orderedNewMappings = new TreeSet<Mapping>(Arrays.asList(newMappings)); - final SortedMap<Mapping, Registration> newRegistrations = new TreeMap<Mapping, Registration>(); + final SortedSet<Mapping> orderedNewMappings = new TreeSet<>(Arrays.asList(newMappings)); + final SortedMap<Mapping, Registration> newRegistrations = new TreeMap<>(); // keep those that are still mapped for (Map.Entry<Mapping, Registration> registrationEntry: activeRegistrations.entrySet()) { @@ -319,7 +328,7 @@ public class ServiceUserMapperImpl imple for (final Registration registration : registrationSet.added) { Mapping mapping = registration.mapping; - final Dictionary<String, Object> properties = new Hashtable<String, Object>(); + final Dictionary<String, Object> properties = new Hashtable<>(); if (mapping.getSubServiceName() != null) { properties.put(ServiceUserMapped.SUBSERVICENAME, mapping.getSubServiceName()); } @@ -368,6 +377,13 @@ public class ServiceUserMapperImpl imple } } + // use default mapping if configured and no default user + if ( this.defaultUser == null || this.defaultUser.isEmpty() ) { + final String userName = "serviceuser@" + serviceName + (subServiceName == null ? "" : ":" + subServiceName); + log.debug("internalGetUserId: no mapping found, using default mapping [{}]", userName); + return userName; + + } log.debug("internalGetUserId: no mapping found, fallback to default user [{}]", this.defaultUser); return this.defaultUser; } @@ -418,8 +434,8 @@ public class ServiceUserMapperImpl imple } class RegistrationSet { - Collection<Registration> added = new ArrayList<Registration>(); - Collection<Registration> removed = new ArrayList<Registration>(); + Collection<Registration> added = new ArrayList<>(); + Collection<Registration> removed = new ArrayList<>(); } } Modified: sling/trunk/bundles/extensions/serviceusermapper/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/serviceusermapper/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java?rev=1790344&r1=1790343&r2=1790344&view=diff ============================================================================== --- sling/trunk/bundles/extensions/serviceusermapper/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java (original) +++ sling/trunk/bundles/extensions/serviceusermapper/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java Thu Apr 6 06:03:13 2017 @@ -42,6 +42,8 @@ public class ServiceUserMapperImplTest { private static final String BUNDLE_SYMBOLIC2 = "bundle2"; + private static final String BUNDLE_SYMBOLIC3 = "bundle3"; + private static final String SUB = "sub"; private static final String NONE = "none"; @@ -58,6 +60,7 @@ public class ServiceUserMapperImplTest { private static final Bundle BUNDLE2; + private static final Bundle BUNDLE3; static { BUNDLE1 = mock(Bundle.class); @@ -65,6 +68,9 @@ public class ServiceUserMapperImplTest { BUNDLE2 = mock(Bundle.class); when(BUNDLE2.getSymbolicName()).thenReturn(BUNDLE_SYMBOLIC2); + + BUNDLE3 = mock(Bundle.class); + when(BUNDLE3.getSymbolicName()).thenReturn(BUNDLE_SYMBOLIC3); } @Test @@ -77,6 +83,57 @@ public class ServiceUserMapperImplTest { BUNDLE_SYMBOLIC2 + ":" + SUB + "=" + ANOTHER_SUB // }); when(config.user_default()).thenReturn(NONE); + when(config.user_default_mapping()).thenReturn(false); + + final ServiceUserMapperImpl sum = new ServiceUserMapperImpl(); + sum.configure(null, config); + + TestCase.assertEquals(SAMPLE, sum.getServiceUserID(BUNDLE1, null)); + TestCase.assertEquals(ANOTHER, sum.getServiceUserID(BUNDLE2, null)); + TestCase.assertEquals(SAMPLE, sum.getServiceUserID(BUNDLE1, "")); + TestCase.assertEquals(ANOTHER, sum.getServiceUserID(BUNDLE2, "")); + TestCase.assertEquals(SAMPLE_SUB, sum.getServiceUserID(BUNDLE1, SUB)); + TestCase.assertEquals(ANOTHER_SUB, sum.getServiceUserID(BUNDLE2, SUB)); + TestCase.assertEquals(NONE, sum.getServiceUserID(BUNDLE3, null)); + TestCase.assertEquals(NONE, sum.getServiceUserID(BUNDLE3, SUB)); + } + + @Test + public void test_getServiceUserIDwithDefaultMappingEnabledAndDefaultUser() { + ServiceUserMapperImpl.Config config = mock(ServiceUserMapperImpl.Config.class); + when(config.user_mapping()).thenReturn(new String[] { + BUNDLE_SYMBOLIC1 + "=" + SAMPLE, // + BUNDLE_SYMBOLIC2 + "=" + ANOTHER, // + BUNDLE_SYMBOLIC1 + ":" + SUB + "=" + SAMPLE_SUB, // + BUNDLE_SYMBOLIC2 + ":" + SUB + "=" + ANOTHER_SUB // + }); + when(config.user_default()).thenReturn(NONE); + when(config.user_default_mapping()).thenReturn(true); + + final ServiceUserMapperImpl sum = new ServiceUserMapperImpl(); + sum.configure(null, config); + + TestCase.assertEquals(SAMPLE, sum.getServiceUserID(BUNDLE1, null)); + TestCase.assertEquals(ANOTHER, sum.getServiceUserID(BUNDLE2, null)); + TestCase.assertEquals(SAMPLE, sum.getServiceUserID(BUNDLE1, "")); + TestCase.assertEquals(ANOTHER, sum.getServiceUserID(BUNDLE2, "")); + TestCase.assertEquals(SAMPLE_SUB, sum.getServiceUserID(BUNDLE1, SUB)); + TestCase.assertEquals(ANOTHER_SUB, sum.getServiceUserID(BUNDLE2, SUB)); + TestCase.assertEquals(NONE, sum.getServiceUserID(BUNDLE3, null)); + TestCase.assertEquals(NONE, sum.getServiceUserID(BUNDLE3, SUB)); + } + + @Test + public void test_getServiceUserIDwithDefaultMappingEnabledAndNoDefaultUser() { + ServiceUserMapperImpl.Config config = mock(ServiceUserMapperImpl.Config.class); + when(config.user_mapping()).thenReturn(new String[] { + BUNDLE_SYMBOLIC1 + "=" + SAMPLE, // + BUNDLE_SYMBOLIC2 + "=" + ANOTHER, // + BUNDLE_SYMBOLIC1 + ":" + SUB + "=" + SAMPLE_SUB, // + BUNDLE_SYMBOLIC2 + ":" + SUB + "=" + ANOTHER_SUB // + }); + when(config.user_default()).thenReturn(null); + when(config.user_default_mapping()).thenReturn(true); final ServiceUserMapperImpl sum = new ServiceUserMapperImpl(); sum.configure(null, config); @@ -87,6 +144,8 @@ public class ServiceUserMapperImplTest { TestCase.assertEquals(ANOTHER, sum.getServiceUserID(BUNDLE2, "")); TestCase.assertEquals(SAMPLE_SUB, sum.getServiceUserID(BUNDLE1, SUB)); TestCase.assertEquals(ANOTHER_SUB, sum.getServiceUserID(BUNDLE2, SUB)); + TestCase.assertEquals("serviceuser@" + BUNDLE_SYMBOLIC3, sum.getServiceUserID(BUNDLE3, null)); + TestCase.assertEquals("serviceuser@" + BUNDLE_SYMBOLIC3 + ":" + SUB, sum.getServiceUserID(BUNDLE3, SUB)); } @Test @@ -99,6 +158,7 @@ public class ServiceUserMapperImplTest { BUNDLE_SYMBOLIC2 + ":" + SUB + "=" + ANOTHER_SUB // }); when(config.user_default()).thenReturn(NONE); + when(config.user_default_mapping()).thenReturn(false); final ServiceUserMapperImpl sum = new ServiceUserMapperImpl(); sum.configure(null, config); @@ -131,6 +191,7 @@ public class ServiceUserMapperImplTest { BUNDLE_SYMBOLIC1 + ":" + SUB + "=" + SAMPLE_SUB, // }); when(config.user_default()).thenReturn(NONE); + when(config.user_default_mapping()).thenReturn(false); final ServiceUserMapperImpl sum = new ServiceUserMapperImpl(); sum.configure(null, config); @@ -172,6 +233,7 @@ public class ServiceUserMapperImplTest { ServiceUserMapperImpl.Config config = mock(ServiceUserMapperImpl.Config.class); when(config.user_mapping()).thenReturn(new String[] {}); when(config.user_default()).thenReturn(NONE); + when(config.user_default_mapping()).thenReturn(false); final ServiceUserMapperImpl sum = new ServiceUserMapperImpl(); sum.configure(null, config); @@ -214,6 +276,7 @@ public class ServiceUserMapperImplTest { BUNDLE_SYMBOLIC1 + ":" + SUB + "=" + SAMPLE_SUB, // }); when(config.user_default()).thenReturn(NONE); + when(config.user_default_mapping()).thenReturn(false); final ServiceUserMapperImpl sum = new ServiceUserMapperImpl(); sum.registerAsync = false; @@ -262,7 +325,7 @@ public class ServiceUserMapperImplTest { final BundleContext bundleContext = mock(BundleContext.class); - final Map<String, Map<Object, Dictionary>> registrations = new HashMap<String, Map<Object, Dictionary>>(); + final Map<String, Map<Object, Dictionary>> registrations = new HashMap<>(); public ServiceRegistrationContextHelper() { when(bundleContext.registerService(any(String.class), any(Object.class), any(Dictionary.class)))