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