This is an automated email from the ASF dual-hosted git repository.

daim pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 8b8bb991d1 OAK-11912 : created DirectExecutorServiuce in oak-commons 
(#2579)
8b8bb991d1 is described below

commit 8b8bb991d1c9a1d9c025fb2f9ecc84f50d912825
Author: Rishabh Kumar <[email protected]>
AuthorDate: Mon Oct 27 10:47:30 2025 +0530

    OAK-11912 : created DirectExecutorServiuce in oak-commons (#2579)
---
 .../internal/concurrent/DirectExecutorService.java | 64 +++++++++++++++++
 .../commons/internal/concurrent/ExecutorUtils.java |  6 +-
 .../concurrent/DirectExecutorServiceTest.java      | 84 ++++++++++++++++++++++
 .../internal/concurrent/ExecutorUtilsTest.java     | 75 +++++++++++++++++++
 4 files changed, 228 insertions(+), 1 deletion(-)

diff --git 
a/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/internal/concurrent/DirectExecutorService.java
 
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/internal/concurrent/DirectExecutorService.java
new file mode 100644
index 0000000000..834e5e69cc
--- /dev/null
+++ 
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/internal/concurrent/DirectExecutorService.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.commons.internal.concurrent;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+import java.util.concurrent.AbstractExecutorService;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.TimeUnit;
+
+public class DirectExecutorService extends AbstractExecutorService {
+
+    private volatile boolean shutdown = false;
+
+    @Override
+    public void shutdown() {
+        shutdown = true;
+    }
+
+    @Override
+    public @NotNull List<Runnable> shutdownNow() {
+        shutdown = true;
+        return List.of();
+    }
+
+    @Override
+    public boolean isShutdown() {
+        return shutdown;
+    }
+
+    @Override
+    public boolean isTerminated() {
+        return shutdown;
+    }
+
+    @Override
+    public boolean awaitTermination(long timeout, TimeUnit unit) {
+        return shutdown;
+    }
+
+    @Override
+    public void execute(Runnable command) {
+        if (shutdown) throw new RejectedExecutionException("Executor is shut 
down");
+        command.run();
+    }
+}
+
diff --git 
a/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtils.java
 
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtils.java
index da71da98bc..4ef9de91e1 100644
--- 
a/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtils.java
+++ 
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtils.java
@@ -18,8 +18,8 @@
  */
 package org.apache.jackrabbit.oak.commons.internal.concurrent;
 
-
 import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
 
 /**
  * Util methods for {@link java.util.concurrent.Executor}
@@ -32,4 +32,8 @@ public class ExecutorUtils {
     public static Executor directExecutor() {
         return DirectExecutor.INSTANCE;
     }
+
+    public static ExecutorService newDirectExecutorService() {
+        return new DirectExecutorService();
+    }
 }
diff --git 
a/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/internal/concurrent/DirectExecutorServiceTest.java
 
b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/internal/concurrent/DirectExecutorServiceTest.java
new file mode 100644
index 0000000000..890de00ddd
--- /dev/null
+++ 
b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/internal/concurrent/DirectExecutorServiceTest.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.commons.internal.concurrent;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.concurrent.Future;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Unit cases for DirectExecutorService
+ */
+public class DirectExecutorServiceTest {
+
+    private DirectExecutorService executor;
+
+    @Before
+    public void setUp() {
+        executor = new DirectExecutorService();
+    }
+
+    @Test
+    public void testRunnableRunsInCallingThread() {
+        final Thread[] runThread = new Thread[1];
+        executor.execute(() -> runThread[0] = Thread.currentThread());
+        // Should be main test thread, not a pool thread
+        Assert.assertEquals(Thread.currentThread(), runThread[0]);
+    }
+
+    @Test
+    public void testCallableReturnsValue() throws Exception {
+        Future<String> future = executor.submit(() -> "hello");
+        Assert.assertEquals("hello", future.get());
+    }
+
+    @Test
+    public void testShutdownBehavior() {
+        Assert.assertFalse(executor.isShutdown());
+        executor.shutdown();
+        Assert.assertTrue(executor.isShutdown());
+        Assert.assertTrue(executor.isTerminated());
+    }
+
+    @Test
+    public void testShutdownNowBehavior() {
+        Assert.assertFalse(executor.isShutdown());
+        executor.shutdownNow();
+        Assert.assertTrue(executor.isShutdown());
+        Assert.assertTrue(executor.isTerminated());
+        Assert.assertEquals(0, executor.shutdownNow().size()); // It doesn't 
queue tasks
+    }
+
+    @Test(expected = RejectedExecutionException.class)
+    public void testRejectsTaskAfterShutdown() {
+        executor.shutdown();
+        executor.execute(() -> {});
+    }
+
+    @Test
+    public void testAwaitTerminationReturnsTrue() {
+        executor.shutdown();
+        Assert.assertTrue(executor.awaitTermination(100, 
TimeUnit.MILLISECONDS));
+    }
+
+}
\ No newline at end of file
diff --git 
a/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtilsTest.java
 
b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtilsTest.java
new file mode 100644
index 0000000000..20b9c81b83
--- /dev/null
+++ 
b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtilsTest.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.commons.internal.concurrent;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+
+/**
+ * Unit cases for ExecutorUtils
+ */
+public class ExecutorUtilsTest {
+
+    @Test
+    public void testDirectExecutorHasOnlyOneInstance() {
+        Executor executor = ExecutorUtils.directExecutor();
+        Assert.assertSame(ExecutorUtils.directExecutor(), executor);
+    }
+
+    @Test
+    public void testDirectExecutorRunsInCallingThread() {
+        Executor executor = ExecutorUtils.directExecutor();
+        final Thread[] runThread = new Thread[1];
+        executor.execute(() -> runThread[0] = Thread.currentThread());
+        Assert.assertEquals(Thread.currentThread(), runThread[0]);
+    }
+
+
+    @Test
+    public void testDirectExecutorServiceReturnNewInstance() {
+        ExecutorService executorService = 
ExecutorUtils.newDirectExecutorService();
+        Assert.assertNotSame(ExecutorUtils.newDirectExecutorService(), 
executorService);
+    }
+
+    @Test
+    public void testNewDirectExecutorServiceRunsInCallingThread() {
+        Executor executor = ExecutorUtils.newDirectExecutorService();
+        final Thread[] runThread = new Thread[1];
+        executor.execute(() -> runThread[0] = Thread.currentThread());
+        Assert.assertEquals(Thread.currentThread(), runThread[0]);
+    }
+
+    @Test
+    public void testNewDirectExecutorServiceReturnsDirectExecutorService() {
+        Object executorService = ExecutorUtils.newDirectExecutorService();
+        Assert.assertTrue(executorService instanceof DirectExecutorService);
+    }
+
+    @Test
+    public void testNewDirectExecutorServiceCallableReturnsValue() throws 
Exception {
+        DirectExecutorService executorService = (DirectExecutorService) 
ExecutorUtils.newDirectExecutorService();
+        Future<String> future = executorService.submit(() -> "test");
+        Assert.assertEquals("test", future.get());
+    }
+
+}
\ No newline at end of file

Reply via email to