X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.util%2Fsrc%2Forg%2Fargeo%2Futil%2FCurrentSubject.java;h=60ce3cf26ed5ad92a204609ed30a18a51c673a5f;hb=257d82f6cab077fa0f58b2c4ad294ab4840155de;hp=d7627629fad89ad08ccaa315a984747d0541b56a;hpb=1079048d9b6dc6003169327ea77eb64029283ecb;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.util/src/org/argeo/util/CurrentSubject.java b/org.argeo.util/src/org/argeo/util/CurrentSubject.java index d7627629f..60ce3cf26 100644 --- a/org.argeo.util/src/org/argeo/util/CurrentSubject.java +++ b/org.argeo.util/src/org/argeo/util/CurrentSubject.java @@ -9,36 +9,57 @@ import java.util.concurrent.CompletionException; import javax.security.auth.Subject; /** - * Prepare evotion of Java APIs introduced in JDK 18, as these static methods + * Prepare evolution of Java APIs introduced in JDK 18, as these static methods * will be added to {@link Subject}. */ @SuppressWarnings("removal") public class CurrentSubject { - /** Singleton. */ - private CurrentSubject() { + private final static boolean useThreadLocal = Boolean + .parseBoolean(System.getProperty("jdk.security.auth.subject.useTL")); - } + private final static InheritableThreadLocal current = new InheritableThreadLocal<>(); public static Subject current() { - Subject subject = Subject.getSubject(AccessController.getContext()); - if (subject == null) - throw new IllegalStateException("Cannot find related subject"); - return subject; + if (useThreadLocal) { + return current.get(); + } else {// legacy + Subject subject = Subject.getSubject(AccessController.getContext()); + return subject; + } } public static T callAs(Subject subject, Callable action) { - try { - return Subject.doAs(subject, new PrivilegedExceptionAction() { - - @Override - public T run() throws Exception { - return action.call(); - } - - }); - } catch (PrivilegedActionException e) { - throw new CompletionException("Failed to execute action for " + subject, e.getCause()); + if (useThreadLocal) { + Subject previous = current(); + current.set(subject); + try { + return action.call(); + } catch (Exception e) { + throw new CompletionException("Failed to execute action for " + subject, e); + } finally { + current.set(previous); + } + } else {// legacy + try { + return Subject.doAs(subject, new PrivilegedExceptionAction() { + + @Override + public T run() throws Exception { + return action.call(); + } + + }); + } catch (PrivilegedActionException e) { + throw new CompletionException("Failed to execute action for " + subject, e.getCause()); + } catch (Exception e) { + throw new CompletionException("Failed to execute action for " + subject, e); + } } } + + /** Singleton. */ + private CurrentSubject() { + } + }