HORNETQ-1381 create new threads under AccessControlContext of the creator of ActiveMQThreadFactory

This commit is contained in:
Ivo Studensky 2014-12-05 12:23:48 +01:00
parent b61747de09
commit ff9052b83b
1 changed files with 37 additions and 12 deletions

View File

@ -16,6 +16,7 @@
*/
package org.apache.activemq.utils;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.concurrent.ThreadFactory;
@ -40,6 +41,8 @@ public final class ActiveMQThreadFactory implements ThreadFactory
private final ClassLoader tccl;
private final AccessControlContext acc;
public ActiveMQThreadFactory(final String groupName, final boolean daemon, final ClassLoader tccl)
{
group = new ThreadGroup(groupName + "-" + System.identityHashCode(this));
@ -49,15 +52,39 @@ public final class ActiveMQThreadFactory implements ThreadFactory
this.tccl = tccl;
this.daemon = daemon;
this.acc = (System.getSecurityManager() == null) ? null : AccessController.getContext();
}
public Thread newThread(final Runnable command)
{
// always create a thread in a privileged block.
return AccessController.doPrivileged(new PrivilegedAction<Thread>()
// create a thread in a privileged block if running with Security Manager
if (acc != null && System.getSecurityManager() != null)
{
@Override
return AccessController.doPrivileged(new ThreadCreateAction(command), acc);
}
else
{
return createThread(command);
}
}
private final class ThreadCreateAction implements PrivilegedAction<Thread>
{
private final Runnable target;
private ThreadCreateAction(final Runnable target)
{
this.target = target;
}
public Thread run()
{
return createThread(target);
}
}
private Thread createThread(final Runnable command)
{
final Thread t = new Thread(group, command, "Thread-" + threadCount.getAndIncrement() + " (" + group.getName() + ")");
t.setDaemon(daemon);
@ -66,7 +93,5 @@ public final class ActiveMQThreadFactory implements ThreadFactory
return t;
}
});
}
}