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);