blob: db10c43260342e68d2fafb907e68a534d0a5eb8e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1997, 2008 by ProSyst Software GmbH
* http://www.prosyst.com
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* ProSyst Software GmbH - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.util.security;
import java.security.*;
import org.eclipse.equinox.internal.util.pool.ObjectCreator;
import org.eclipse.equinox.internal.util.pool.ObjectPool;
/**
* A simple wrapper for executing privileged actions.
*
* @author Valentin Valchev
* @author Pavlin Dobrev
* @version 1.0
*/
public final class PrivilegedRunner implements ObjectCreator {
private static ObjectPool POOL;
static {
try {
POOL = new ObjectPool(new PrivilegedRunner(), 5, 10);
} catch (Exception e) {
e.printStackTrace();
}
}
/* prevent instantiations */
private PrivilegedRunner() {
}
/**
* Same as the longer doPrivileged method, but fills in the first parameter
* only. All other parameters are set to <code>null</code>.
*
* @param context
* the access context
* @param dispatcher
* the dispatcher which should be called
* @param type
* the type of the action - used in the dispatcher
* @param arg1
* a parameter received by the dispatcher
* @see #doPrivileged(Object, PrivilegedDispatcher, int, Object)
* @return the object returned from the execution
* @throws Exception
* if the dispatcher fails
*/
public static final Object doPrivileged(Object context, PrivilegedDispatcher dispatcher, int type, Object arg1) throws Exception {
return doPrivileged(context, dispatcher, type, arg1, null, null, null);
}
/**
* Performs a privileged action. The method calls the dispatcher inside the
* privileged call passing it the same parameters that were passed to this
* method.
*
* @param context
* the access context
* @param dispatcher
* the dispatcher which should be called
* @param type
* the type of the action - used in the dispatcher
* @param arg1
* a parameter received by the dispatcher
* @param arg2
* a parameter received by the dispatcher
* @param arg3
* a parameter received by the dispatcher
* @param arg4
* a parameter received by the dispatcher
* @return the object returned from the execution
* @throws Exception
* if the dispatcher fails
*/
public static final Object doPrivileged(Object context, PrivilegedDispatcher dispatcher, int type, Object arg1, Object arg2, Object arg3, Object arg4) throws Exception {
/* init runner */
PA runner = (PA) POOL.getObject();
runner.dispatcher = dispatcher;
runner.type = type;
runner.arg1 = arg1;
runner.arg2 = arg2;
runner.arg3 = arg3;
runner.arg4 = arg4;
try {
if (System.getSecurityManager() != null) {
/*
* if security manager is set - then privileged execution is
* started
*/
if (context != null) {
return AccessController.doPrivileged(runner, (AccessControlContext) context);
}
return AccessController.doPrivileged(runner);
}
/* if no security manager is set - simply run the action */
return runner.run();
} catch (PrivilegedActionException e) {
throw e.getException();
} finally {
runner.recycle();
POOL.releaseObject(runner);
}
}
/**
* @see org.eclipse.equinox.internal.util.pool.ObjectCreator#getInstance()
*/
public Object getInstance() throws Exception {
return new PA();
}
/**
* This dispatcher is the handler that is called within the privileged call.
* It should dispatch and perform the requested actions depending on the
* action type and using the given job parameters.
*
* @author Valentin Valchev
* @version $Revision: 1.1 $
*/
public static interface PrivilegedDispatcher {
/**
* @param type
* the type of the action
* @param arg1
* parameter 1 - depends on the action type
* @param arg2
* parameter 2 - depends on the action type
* @param arg3
* parameter 3 - depends on the action type
* @param arg4
* parameter 4 - depends on the action type
* @return an object which should be returned from the
* PrivilegedAction.run() method
* @throws Exception
* on error
*/
Object dispatchPrivileged(int type, Object arg1, Object arg2, Object arg3, Object arg4) throws Exception;
}
static class PA implements PrivilegedExceptionAction {
int type;
Object arg1, arg2, arg3, arg4;
PrivilegedDispatcher dispatcher;
void recycle() {
dispatcher = null;
type = -1;
arg1 = arg2 = arg3 = arg4 = null;
}
/**
* @see java.security.PrivilegedExceptionAction#run()
*/
public Object run() throws Exception {
return dispatcher.dispatchPrivileged(type, arg1, arg2, arg3, arg4);
}
}
}