Introduce system callables
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 17 Apr 2011 07:58:19 +0000 (07:58 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 17 Apr 2011 07:58:19 +0000 (07:58 +0000)
NEW - bug 17: Generalize agent management and registration beyond JMS
https://bugzilla.argeo.org/show_bug.cgi?id=17

git-svn-id: https://svn.argeo.org/commons/trunk@4442 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/SystemExecutionService.java
security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/core/KeyBasedSystemExecutionService.java

index b67eb27b1446bad9275e11b2ff103f555c518052..e03f27ab2461455cb7abff01f0b64ae978a95a32 100644 (file)
@@ -1,6 +1,8 @@
 package org.argeo.security;
 
+import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
+import java.util.concurrent.Future;
 
 /**
  * Allows to execute code authenticated as a system user (that is not a real
@@ -10,9 +12,16 @@ import java.util.concurrent.Executor;
  */
 public interface SystemExecutionService extends Executor {
        /**
-        * Executes this Runnable within a system authenticated context.
+        * Executes this {@link Runnable} within a system authenticated context.
         * Implementations should make sure that this method is properly secured via
         * Java permissions since it could access to everything without credentials.
         */
        public void execute(Runnable runnable);
+       
+       /**
+        * Executes this {@link Callable} within a system authenticated context.
+        * Implementations should make sure that this method is properly secured via
+        * Java permissions since it could access to everything without credentials.
+        */
+       public <T> Future<T> submit(Callable<T> task);
 }
index 3923715155dcd314a974984b7ec6d87f5a5750a2..b2dfc4a2439922cbd795d3c6c1522444130903c2 100644 (file)
@@ -1,6 +1,10 @@
 package org.argeo.security.core;
 
 import java.security.AccessController;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.FutureTask;
 
 import javax.security.auth.Subject;
 
@@ -20,13 +24,26 @@ public class KeyBasedSystemExecutionService implements SystemExecutionService {
        private String systemAuthenticationKey;
 
        public void execute(Runnable runnable) {
-               wrapWithSystemAuthentication(runnable).run();
+               try {
+                       wrapWithSystemAuthentication(Executors.callable(runnable)).call();
+               } catch (Exception e) {
+                       throw new ArgeoException(
+                                       "Exception when running system authenticated task", e);
+               }
        }
 
-       protected Runnable wrapWithSystemAuthentication(final Runnable runnable) {
-               return new Runnable() {
+       public <T> Future<T> submit(Callable<T> task) {
+               FutureTask<T> future = new FutureTask<T>(
+                               wrapWithSystemAuthentication(task));
+               future.run();
+               return future;
+       }
+
+       protected <T> Callable<T> wrapWithSystemAuthentication(
+                       final Callable<T> runnable) {
+               return new Callable<T>() {
 
-                       public void run() {
+                       public T call() throws Exception {
                                SecurityContext securityContext = SecurityContextHolder
                                                .getContext();
                                Authentication currentAuth = securityContext
@@ -51,7 +68,7 @@ public class KeyBasedSystemExecutionService implements SystemExecutionService {
                                                                systemAuthenticationKey));
                                securityContext.setAuthentication(auth);
                                try {
-                                       runnable.run();
+                                       return runnable.call();
                                } finally {
                                        // remove the authentication
                                        securityContext.setAuthentication(null);