Create and shutdown ExecutorService in a doPriv with the resolver code AccessControlContext (FELIX-5011).

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1697509 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java b/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
index 3b2b6b5..1484064 100644
--- a/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
+++ b/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
@@ -18,6 +18,9 @@
  */
 package org.apache.felix.resolver;
 
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -56,6 +59,11 @@
 
 public class ResolverImpl implements Resolver
 {
+    private final AccessControlContext m_acc =
+        System.getSecurityManager() != null ?
+            AccessController.getContext() :
+            null;
+
     private final Logger m_logger;
 
     private final int m_parallelism;
@@ -134,14 +142,37 @@
         }
         else if (m_parallelism > 1)
         {
-            ExecutorService executor = Executors.newFixedThreadPool(m_parallelism);
+            final ExecutorService executor =
+                System.getSecurityManager() != null ?
+                    AccessController.doPrivileged(
+                        new PrivilegedAction<ExecutorService>()
+                        {
+                            public ExecutorService run()
+                            {
+                                return Executors.newFixedThreadPool(m_parallelism);
+                            }
+                        }, m_acc)
+                :
+                    Executors.newFixedThreadPool(m_parallelism);
             try
             {
                 return resolve(rc, executor);
             }
             finally
             {
-                executor.shutdownNow();
+                if (System.getSecurityManager() != null)
+                {
+                    AccessController.doPrivileged(new PrivilegedAction<Void>(){
+                        public Void run() {
+                            executor.shutdownNow();
+                            return null;
+                        }
+                    }, m_acc);
+                }
+                else
+                {
+                    executor.shutdownNow();
+                }
             }
         }
         else