001 /*
002 * (c) 2010 ThoughtWorks Ltd
003 * All rights reserved.
004 *
005 * The software in this package is published under the terms of the BSD
006 * style license a copy of which has been included with this distribution in
007 * the LICENSE.txt file.
008 *
009 * Created on 10-04-2010.
010 */
011 package com.thoughtworks.proxy.toys.privilege;
012
013 import java.security.AccessControlContext;
014 import java.security.PrivilegedActionException;
015 import java.security.PrivilegedExceptionAction;
016
017 import javax.security.auth.Subject;
018
019
020 /**
021 * Execution of a {@link PrivilegedExceptionAction} with a {@link Subject}.
022 *
023 * @author Jörg Schaible
024 * @since 1.0
025 */
026 public class SubjectExecutor implements ActionExecutor {
027 private final AccessControlContext context;
028 private final Subject subject;
029
030 /**
031 * Construct a SubjectExecutor that runs a {@link PrivilegedExceptionAction} with
032 * the {@link Subject#doAs(Subject, PrivilegedExceptionAction)} method.
033 *
034 * @param subject the subject used to run the methods
035 * @since 1.0
036 */
037 public SubjectExecutor(Subject subject) {
038 this(subject, null);
039 }
040
041 /**
042 * Construct a SubjectExecutor that runs a {@link PrivilegedExceptionAction} with
043 * the {@link Subject#doAsPrivileged(Subject, PrivilegedExceptionAction, AccessControlContext)} method.
044 *
045 * @param subject the subject used to run the methods
046 * @param context the {@link AccessControlContext} defining privileges for the subject
047 * @since 1.0
048 */
049 public SubjectExecutor(Subject subject, AccessControlContext context) {
050 this.subject = subject;
051 this.context = context;
052 }
053
054 public Object execute(PrivilegedExceptionAction<Object> action)
055 throws PrivilegedActionException {
056 if (context == null) {
057 return Subject.doAs(subject, action);
058 } else {
059 return Subject.doAsPrivileged(subject, action, context);
060 }
061 }
062 }