From 4b848f925d80b93d88390082d8495fa4ce3ebf10 Mon Sep 17 00:00:00 2001 From: Craig Perkins Date: Fri, 20 Jun 2025 11:13:26 -0400 Subject: [PATCH 1/5] Update Subject interface to use CheckedRunnable Signed-off-by: Craig Perkins --- .../org/opensearch/identity/shiro/ShiroPluginSubject.java | 6 +++--- server/src/main/java/org/opensearch/identity/Subject.java | 6 +++--- .../opensearch/identity/noop/NoopPluginSubjectTests.java | 5 +---- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/plugins/identity-shiro/src/main/java/org/opensearch/identity/shiro/ShiroPluginSubject.java b/plugins/identity-shiro/src/main/java/org/opensearch/identity/shiro/ShiroPluginSubject.java index 31dde34f447d4..e6f74df582333 100644 --- a/plugins/identity-shiro/src/main/java/org/opensearch/identity/shiro/ShiroPluginSubject.java +++ b/plugins/identity-shiro/src/main/java/org/opensearch/identity/shiro/ShiroPluginSubject.java @@ -8,6 +8,7 @@ package org.opensearch.identity.shiro; +import org.opensearch.common.CheckedRunnable; import org.opensearch.common.annotation.ExperimentalApi; import org.opensearch.common.util.concurrent.ThreadContext; import org.opensearch.identity.NamedPrincipal; @@ -15,7 +16,6 @@ import org.opensearch.threadpool.ThreadPool; import java.security.Principal; -import java.util.concurrent.Callable; /** * Implementation of subject that is always authenticated @@ -41,9 +41,9 @@ public Principal getPrincipal() { } @Override - public T runAs(Callable callable) throws Exception { + public void runAs(CheckedRunnable r) throws Exception { try (ThreadContext.StoredContext ctx = threadPool.getThreadContext().stashContext()) { - return callable.call(); + r.run(); } } } diff --git a/server/src/main/java/org/opensearch/identity/Subject.java b/server/src/main/java/org/opensearch/identity/Subject.java index 0fb0e53848d80..82ee5dad3163a 100644 --- a/server/src/main/java/org/opensearch/identity/Subject.java +++ b/server/src/main/java/org/opensearch/identity/Subject.java @@ -5,10 +5,10 @@ package org.opensearch.identity; +import org.opensearch.common.CheckedRunnable; import org.opensearch.common.annotation.ExperimentalApi; import java.security.Principal; -import java.util.concurrent.Callable; /** * An individual, process, or device that causes information to flow among objects or change to the system state. @@ -26,7 +26,7 @@ public interface Subject { /** * runAs allows the caller to run a callable function as this subject */ - default T runAs(Callable callable) throws Exception { - return callable.call(); + default void runAs(CheckedRunnable r) throws Exception { + r.run(); }; } diff --git a/server/src/test/java/org/opensearch/identity/noop/NoopPluginSubjectTests.java b/server/src/test/java/org/opensearch/identity/noop/NoopPluginSubjectTests.java index 79c26a7eb790d..2c67060651618 100644 --- a/server/src/test/java/org/opensearch/identity/noop/NoopPluginSubjectTests.java +++ b/server/src/test/java/org/opensearch/identity/noop/NoopPluginSubjectTests.java @@ -48,10 +48,7 @@ public void testInitializeIdentityAwarePlugin() throws Exception { assertThat(testPluginSubject.getPrincipal().getName(), equalTo(NamedPrincipal.UNAUTHENTICATED.getName())); threadPool.getThreadContext().putHeader("test_header", "foo"); assertThat(threadPool.getThreadContext().getHeader("test_header"), equalTo("foo")); - testPluginSubject.runAs(() -> { - assertNull(threadPool.getThreadContext().getHeader("test_header")); - return null; - }); + testPluginSubject.runAs(() -> { assertNull(threadPool.getThreadContext().getHeader("test_header")); }); assertThat(threadPool.getThreadContext().getHeader("test_header"), equalTo("foo")); terminate(threadPool); } From dbb1be2e22a6c85bc97c57d2ac5a9ff534caf9bc Mon Sep 17 00:00:00 2001 From: Craig Perkins Date: Fri, 20 Jun 2025 11:16:03 -0400 Subject: [PATCH 2/5] Add to CHANGELOG Signed-off-by: Craig Perkins --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7a5cfda0a4c2..4208417714e1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Ability to run Code Coverage with Gradle and produce the jacoco reports locally ([#18509](https://github.com/opensearch-project/OpenSearch/issues/18509)) ### Changed +- Update Subject interface to use CheckedRunnable ([#18570](https://github.com/opensearch-project/OpenSearch/issues/18570)) ### Dependencies - Bump `stefanzweifel/git-auto-commit-action` from 5 to 6 ([#18524](https://github.com/opensearch-project/OpenSearch/pull/18524)) From b84ec515f3526ba6d7e2204d22850f8e7558f3fc Mon Sep 17 00:00:00 2001 From: Craig Perkins Date: Fri, 20 Jun 2025 11:18:54 -0400 Subject: [PATCH 3/5] Update more instances Signed-off-by: Craig Perkins --- .../org/opensearch/identity/shiro/ShiroPluginSubject.java | 2 +- server/src/main/java/org/opensearch/identity/Subject.java | 2 +- .../org/opensearch/identity/noop/NoopPluginSubject.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/identity-shiro/src/main/java/org/opensearch/identity/shiro/ShiroPluginSubject.java b/plugins/identity-shiro/src/main/java/org/opensearch/identity/shiro/ShiroPluginSubject.java index e6f74df582333..fcce31ce7eb1c 100644 --- a/plugins/identity-shiro/src/main/java/org/opensearch/identity/shiro/ShiroPluginSubject.java +++ b/plugins/identity-shiro/src/main/java/org/opensearch/identity/shiro/ShiroPluginSubject.java @@ -41,7 +41,7 @@ public Principal getPrincipal() { } @Override - public void runAs(CheckedRunnable r) throws Exception { + public void runAs(CheckedRunnable r) throws E { try (ThreadContext.StoredContext ctx = threadPool.getThreadContext().stashContext()) { r.run(); } diff --git a/server/src/main/java/org/opensearch/identity/Subject.java b/server/src/main/java/org/opensearch/identity/Subject.java index 82ee5dad3163a..80c68c6e72881 100644 --- a/server/src/main/java/org/opensearch/identity/Subject.java +++ b/server/src/main/java/org/opensearch/identity/Subject.java @@ -26,7 +26,7 @@ public interface Subject { /** * runAs allows the caller to run a callable function as this subject */ - default void runAs(CheckedRunnable r) throws Exception { + default void runAs(CheckedRunnable r) throws E { r.run(); }; } diff --git a/server/src/main/java/org/opensearch/identity/noop/NoopPluginSubject.java b/server/src/main/java/org/opensearch/identity/noop/NoopPluginSubject.java index 20e075276f317..0ed6bd4e6254d 100644 --- a/server/src/main/java/org/opensearch/identity/noop/NoopPluginSubject.java +++ b/server/src/main/java/org/opensearch/identity/noop/NoopPluginSubject.java @@ -8,6 +8,7 @@ package org.opensearch.identity.noop; +import org.opensearch.common.CheckedRunnable; import org.opensearch.common.annotation.InternalApi; import org.opensearch.common.util.concurrent.ThreadContext; import org.opensearch.identity.NamedPrincipal; @@ -15,7 +16,6 @@ import org.opensearch.threadpool.ThreadPool; import java.security.Principal; -import java.util.concurrent.Callable; /** * Implementation of subject that is always authenticated @@ -41,9 +41,9 @@ public Principal getPrincipal() { } @Override - public T runAs(Callable callable) throws Exception { + public void runAs(CheckedRunnable r) throws E { try (ThreadContext.StoredContext ctx = threadPool.getThreadContext().stashContext()) { - return callable.call(); + r.run(); } } } From 9e12aaf5ccc69d559e524c6da9cdc27a08e475b9 Mon Sep 17 00:00:00 2001 From: Craig Perkins Date: Fri, 20 Jun 2025 11:29:13 -0400 Subject: [PATCH 4/5] Mark with PublicApi Signed-off-by: Craig Perkins --- .../src/main/java/org/opensearch/common/CheckedRunnable.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libs/common/src/main/java/org/opensearch/common/CheckedRunnable.java b/libs/common/src/main/java/org/opensearch/common/CheckedRunnable.java index cb773ab789180..cbbe3b2fa965e 100644 --- a/libs/common/src/main/java/org/opensearch/common/CheckedRunnable.java +++ b/libs/common/src/main/java/org/opensearch/common/CheckedRunnable.java @@ -32,11 +32,14 @@ package org.opensearch.common; +import org.opensearch.common.annotation.PublicApi; + /** * A {@link Runnable}-like interface which allows throwing checked exceptions. * * @opensearch.api */ +@PublicApi(since = "3.2.0") @FunctionalInterface public interface CheckedRunnable { void run() throws E; From 48c9642a9a8d660d99b45ac6ea1ef583cdfe8e90 Mon Sep 17 00:00:00 2001 From: Craig Perkins Date: Fri, 20 Jun 2025 15:01:05 -0400 Subject: [PATCH 5/5] Update javadoc Signed-off-by: Craig Perkins --- server/src/main/java/org/opensearch/identity/Subject.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/org/opensearch/identity/Subject.java b/server/src/main/java/org/opensearch/identity/Subject.java index 80c68c6e72881..2aa17bed2ce74 100644 --- a/server/src/main/java/org/opensearch/identity/Subject.java +++ b/server/src/main/java/org/opensearch/identity/Subject.java @@ -24,7 +24,7 @@ public interface Subject { Principal getPrincipal(); /** - * runAs allows the caller to run a callable function as this subject + * runAs allows the caller to run a {@link CheckedRunnable} as this subject */ default void runAs(CheckedRunnable r) throws E { r.run();