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 */
011package com.thoughtworks.proxy.toys.privilege;
012
013import java.security.AccessControlContext;
014import java.security.PrivilegedActionException;
015import java.security.PrivilegedExceptionAction;
016
017import 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 */
026public 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}