001    /**
002     * Copyright 2005-2012 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.krad.exception;
017    
018    import org.kuali.rice.core.api.exception.KualiException;
019    import org.kuali.rice.core.api.util.RiceKeyConstants;
020    
021    import java.util.Collections;
022    import java.util.Map;
023    
024    /**
025     * Represents an exception that is thrown when a given user is not authorized to take the given action on the given
026     * target type
027     *
028     * @author Kuali Rice Team (rice.collab@kuali.org)
029     */
030    public class AuthorizationException extends KualiException {
031        private static final long serialVersionUID = -3874239711783179351L;
032    
033        protected final String userId;
034        protected final String action;
035        protected final String targetType;
036        protected final Map<String, Object> additionalDetails;
037    
038        public AuthorizationException(String userId, String action, String targetType) {
039            this(userId, action, targetType, Collections.<String, Object>emptyMap());
040        }
041    
042        /**
043         * Constructs a exception with a message from the passed in information.
044         *
045         * @param userId the userid of the user who failed authorization
046         * @param action the action the user was trying to take
047         * @param targetType what the user was trying to take action on
048         * @param additionalDetails additional details about the authorization failure to be passed in and added to the
049         * exception message (ex: permission name, qualifiers, etc.)
050         */
051        public AuthorizationException(String userId, String action, String targetType,
052                Map<String, Object> additionalDetails) {
053            this(userId, action, targetType, "user '" + userId + "' is not authorized to take action '" + action
054                    + "' on targets of type '" + targetType + "'"
055                    + (additionalDetails != null && !additionalDetails.isEmpty() ?
056                    " Additional Details : " + additionalDetails : ""), additionalDetails);
057        }
058    
059        /**
060         * Allows you to construct the exception message manually
061         */
062        public AuthorizationException(String userId, String action, String targetType, String message,
063                Map<String, Object> additionalDetails) {
064            super(message);
065    
066            this.userId = userId;
067            this.action = action;
068            this.targetType = targetType;
069            this.additionalDetails = additionalDetails;
070        }
071    
072        public String getUserId() {
073            return userId;
074        }
075    
076        public String getAction() {
077            return action;
078        }
079    
080        public String getTargetType() {
081            return targetType;
082        }
083    
084        public Map<String, Object> getAdditionalDetails() {
085            return additionalDetails;
086        }
087    
088        /**
089         * @return message key used by Struts to select the error message to be displayed
090         * @deprecated
091         */
092        @Deprecated
093        public String getErrorMessageKey() {
094            return RiceKeyConstants.AUTHORIZATION_ERROR_GENERAL;
095        }
096    }