Author: sseifert
Date: Mon Mar 27 07:33:50 2017
New Revision: 1788836

URL: http://svn.apache.org/viewvc?rev=1788836&view=rev
Log:
SLING-6714 sling-mock-oak 1.x: Register ExecutorService separately

Modified:
    
sling/branches/testing/mocks/sling-mock-oak-1.x/src/main/java/org/apache/sling/testing/mock/sling/oak/OakMockSlingRepository.java

Modified: 
sling/branches/testing/mocks/sling-mock-oak-1.x/src/main/java/org/apache/sling/testing/mock/sling/oak/OakMockSlingRepository.java
URL: 
http://svn.apache.org/viewvc/sling/branches/testing/mocks/sling-mock-oak-1.x/src/main/java/org/apache/sling/testing/mock/sling/oak/OakMockSlingRepository.java?rev=1788836&r1=1788835&r2=1788836&view=diff
==============================================================================
--- 
sling/branches/testing/mocks/sling-mock-oak-1.x/src/main/java/org/apache/sling/testing/mock/sling/oak/OakMockSlingRepository.java
 (original)
+++ 
sling/branches/testing/mocks/sling-mock-oak-1.x/src/main/java/org/apache/sling/testing/mock/sling/oak/OakMockSlingRepository.java
 Mon Mar 27 07:33:50 2017
@@ -19,7 +19,10 @@
 package org.apache.sling.testing.mock.sling.oak;
 
 import java.lang.reflect.Field;
+import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
 
 import javax.jcr.Credentials;
 import javax.jcr.LoginException;
@@ -38,6 +41,7 @@ import org.apache.jackrabbit.api.Jackrab
 import org.apache.jackrabbit.oak.Oak;
 import org.apache.jackrabbit.oak.jcr.Jcr;
 import org.apache.sling.jcr.api.SlingRepository;
+import org.osgi.framework.BundleContext;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,41 +53,58 @@ public final class OakMockSlingRepositor
     private static final String ADMIN_NAME = "admin";
     private static final String ADMIN_PASSWORD = "admin";
 
-    private Oak oak;
     private Repository repository;
+    private ExecutorService executor;
+    private ScheduledExecutorService scheduledExecutor;
     
     private static final Logger log = 
LoggerFactory.getLogger(OakMockSlingRepository.class);
     
     @Activate
     protected void activate(ComponentContext componentContext) {
-        this.oak = new Oak();
-        Jcr jcr = new Jcr(oak).with(new ExtraSlingContent());
+        executor = Executors.newSingleThreadExecutor();
+        scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
+        
+        BundleContext bundleContext = componentContext.getBundleContext();
+        if (bundleContext.getServiceReference(Executor.class.getName()) == 
null) {
+            bundleContext.registerService(Executor.class.getName(), executor, 
null);
+        }
+        
+        Oak oak = new Oak()
+                .with(executor)
+                .with(scheduledExecutor);
+        
+        Jcr jcr = new Jcr(oak)
+                .with(new ExtraSlingContent())
+                .with(executor)
+                .with(scheduledExecutor);
+        
         this.repository = jcr.createRepository();
     }
 
     @Deactivate
     protected void deactivate(ComponentContext componentContext) {
+        // shutdown executors
+        // force immediate shutdown for all executors without waiting for 
tasks for completion - we're only in unit tests! 
+        executor.shutdownNow();
+        scheduledExecutor.shutdownNow();
+        shutdownExecutorService(repository, "scheduledExecutor");
+
         // shutdown OAK JCR repository
         ((JackrabbitRepository)repository).shutdown();
-        
-        // shutdown further OAK executor services via reflection
-        shutdownExecutorService("executor");
-        shutdownExecutorService("scheduledExecutor");
     }
     
-    private void shutdownExecutorService(String fieldName) {
+    private void shutdownExecutorService(Object instance, String fieldName) {
         try {
-            Field executorField = Oak.class.getDeclaredField(fieldName); 
+            Field executorField = 
instance.getClass().getDeclaredField(fieldName); 
             executorField.setAccessible(true);
-            ExecutorService executor = 
(ExecutorService)executorField.get(this.oak);
+            ExecutorService executor = 
(ExecutorService)executorField.get(instance);
             executor.shutdownNow();
         }
         catch (Throwable ex) {
-            log.error("Potential Memory leak: Unable to shutdown executor 
service from field '" + fieldName + "' in " + this.oak, ex);
+            log.error("Potential Memory leak: Unable to shutdown executor 
service from field '" + fieldName + "' in " + instance, ex);
         }
     }
 
-
     public String getDescriptor(String key) {
         return repository.getDescriptor(key);
     }


Reply via email to