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)) 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; 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..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 @@ -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 E { 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..2aa17bed2ce74 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. @@ -24,9 +24,9 @@ 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 T runAs(Callable callable) throws Exception { - return callable.call(); + 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(); } } } 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); }