| /******************************************************************************* |
| * 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); |
| } |
| } |
| |
| } |