You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by mp...@apache.org on 2015/10/30 15:09:27 UTC

svn commit: r1711481 - in /sling/trunk/bundles/extensions/serviceusermapper/src: main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java

Author: mpetria
Date: Fri Oct 30 14:09:27 2015
New Revision: 1711481

URL: http://svn.apache.org/viewvc?rev=1711481&view=rev
Log:
SLING-5006: do service registrations asyncronously and outside syncronized area

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=1711481&r1=1711480&r2=1711481&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 Fri Oct 30 14:09:27 2015
@@ -32,6 +32,8 @@ import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -111,9 +113,17 @@ public class ServiceUserMapperImpl imple
 
     private BundleContext bundleContext;
 
+    private ExecutorService executorService;
+
+    public boolean registerAsync = true;
+
     @Activate
     @Modified
     synchronized void configure(BundleContext bundleContext, final Map<String, Object> config) {
+        if (registerAsync && executorService == null) {
+            executorService = Executors.newSingleThreadExecutor();
+        }
+
         final String[] props = PropertiesUtil.toStringArray(config.get(PROP_SERVICE2USER_MAPPING),
             PROP_SERVICE2USER_MAPPING_DEFAULT);
 
@@ -136,7 +146,7 @@ public class ServiceUserMapperImpl imple
         this.bundleContext = bundleContext;
         registrationSet = this.updateMappings();
 
-        this.executeServiceRegistrations(registrationSet);
+        this.executeServiceRegistrationsAsync(registrationSet);
     }
 
     @Deactivate
@@ -144,14 +154,17 @@ public class ServiceUserMapperImpl imple
         RegistrationSet registrationSet = null;
         updateServiceRegistrations(new Mapping[0]);
         bundleContext = null;
-        this.executeServiceRegistrations(registrationSet);
+        this.executeServiceRegistrationsAsync(registrationSet);
+        if (executorService != null) {
+            executorService.shutdown();
+        }
     }
 
     private void restartAllActiveServiceUserMappedServices() {
         RegistrationSet registrationSet = new RegistrationSet();
         registrationSet.removed = activeRegistrations.values();
         registrationSet.added = activeRegistrations.values();
-        executeServiceRegistrations(registrationSet);
+        executeServiceRegistrationsAsync(registrationSet);
     }
 
     /**
@@ -187,7 +200,7 @@ public class ServiceUserMapperImpl imple
         RegistrationSet registrationSet = null;
         amendments.put(key, amendment);
         registrationSet = this.updateMappings();
-        executeServiceRegistrations(registrationSet);
+        executeServiceRegistrationsAsync(registrationSet);
     }
 
     protected synchronized void unbindAmendment(final MappingConfigAmendment amendment, final Map<String, Object> props) {
@@ -196,7 +209,7 @@ public class ServiceUserMapperImpl imple
         if ( amendments.remove(key) != null ) {
              registrationSet = this.updateMappings();
         }
-        executeServiceRegistrations(registrationSet);
+        executeServiceRegistrationsAsync(registrationSet);
     }
 
     protected void updateAmendment(final MappingConfigAmendment amendment, final Map<String, Object> props) {
@@ -247,11 +260,8 @@ public class ServiceUserMapperImpl imple
             if (!orderedNewMappings.contains(registrationEntry.getKey())) {
                 Registration registration = registrationEntry.getValue();
 
-                // remove it only if it is a completed registration
-                if (registration.serviceRegistration != null) {
-                    result.removed.add(registration);
-                    keepEntry = false;
-                }
+                result.removed.add(registration);
+                keepEntry = false;
             }
 
             if (keepEntry) {
@@ -262,7 +272,7 @@ public class ServiceUserMapperImpl imple
         // add those that are new
         for (final Mapping mapping: orderedNewMappings) {
             if (!newRegistrations.containsKey(mapping)) {
-                Registration registration = new Registration(mapping, null);
+                Registration registration = new Registration(mapping);
                 newRegistrations.put(mapping, registration);
                 result.added.add(registration);
             }
@@ -273,6 +283,21 @@ public class ServiceUserMapperImpl imple
         return result;
     }
 
+    private void executeServiceRegistrationsAsync(final RegistrationSet registrationSet) {
+
+        if (executorService == null) {
+            executeServiceRegistrations(registrationSet);
+        } else {
+            executorService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    executeServiceRegistrations(registrationSet);
+                }
+            });
+        }
+    }
+
+
     private void executeServiceRegistrations(RegistrationSet registrationSet) {
 
         if (registrationSet == null) {
@@ -280,13 +305,16 @@ public class ServiceUserMapperImpl imple
         }
 
         for (Registration registration : registrationSet.removed) {
-            if (registration.serviceRegistration != null) {
+
+
+            ServiceRegistration serviceRegistration = registration.setService(null);
+
+            if (serviceRegistration != null) {
                 try {
-                    registration.serviceRegistration.unregister();
+                    serviceRegistration.unregister();
                 } catch (IllegalStateException e) {
                     log.error("cannot unregister ServiceUserMapped {}", registration.mapping,  e);
                 }
-                registration.serviceRegistration = null;
             }
         }
 
@@ -307,7 +335,15 @@ public class ServiceUserMapperImpl imple
             final ServiceRegistration serviceRegistration = savedBundleContext.registerService(ServiceUserMappedImpl.SERVICEUSERMAPPED,
                     new ServiceUserMappedImpl(), properties);
 
-            registration.serviceRegistration = serviceRegistration;
+            ServiceRegistration oldServiceRegistration = registration.setService(serviceRegistration);
+
+            if (oldServiceRegistration != null) {
+                try {
+                    oldServiceRegistration.unregister();
+                } catch (IllegalStateException e) {
+                    log.error("cannot unregister ServiceUserMapped {}", registration.mapping,  e);
+                }
+            }
         }
 
     }
@@ -360,9 +396,16 @@ public class ServiceUserMapperImpl imple
         private Mapping mapping;
         private ServiceRegistration serviceRegistration;
 
-        Registration(Mapping mapping, ServiceRegistration serviceRegistration) {
+
+        Registration(Mapping mapping) {
             this.mapping = mapping;
+            this.serviceRegistration = null;
+        }
+
+        synchronized ServiceRegistration setService(ServiceRegistration serviceRegistration) {
+            ServiceRegistration oldServiceRegistration = this.serviceRegistration;
             this.serviceRegistration = serviceRegistration;
+            return oldServiceRegistration;
         }
     }
 

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=1711481&r1=1711480&r2=1711481&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 Fri Oct 30 14:09:27 2015
@@ -233,6 +233,7 @@ public class ServiceUserMapperImplTest {
         };
 
         final ServiceUserMapperImpl sum = new ServiceUserMapperImpl();
+        sum.registerAsync = false;
         final ServiceRegistrationContextHelper context = new ServiceRegistrationContextHelper();
         sum.configure(context.getBundleContext(), config);