001    /*
002     * Copyright 2007-2009 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 responsibilitys and
014     * limitations under the License.
015     */
016    package org.kuali.rice.kim.impl.responsibility;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.kuali.rice.core.api.util.RiceKeyConstants;
020    import org.kuali.rice.kim.api.responsibility.Responsibility;
021    import org.kuali.rice.kim.bo.ui.KimDocumentRoleResponsibility;
022    import org.kuali.rice.kim.document.IdentityManagementRoleDocument;
023    import org.kuali.rice.kim.util.KimConstants;
024    import org.kuali.rice.krad.rules.DocumentRuleBase;
025    import org.kuali.rice.krad.util.GlobalVariables;
026    
027    import java.util.HashMap;
028    import java.util.Map;
029    
030    /**
031     * This is a description of what this class does - shyu don't forget to fill this in. 
032     * 
033     * @author Kuali Rice Team (rice.collab@kuali.org)
034     *
035     */
036    public class KimDocumentResponsibilityRule extends DocumentRuleBase implements AddResponsibilityRule {
037    
038            public static final String ERROR_PATH = "document.responsibility.responsibilityId";
039    
040            public boolean processAddResponsibility(AddResponsibilityEvent addResponsibilityEvent) {
041                    KimDocumentRoleResponsibility newResponsibility = addResponsibilityEvent.getResponsibility();
042                    if(newResponsibility==null){
043                            GlobalVariables.getMessageMap().putError(ERROR_PATH, RiceKeyConstants.ERROR_EMPTY_ENTRY, new String[] {"Responsibility"});
044                            return false;
045                    }
046    
047                    ResponsibilityBo kimResponsibilityImpl = newResponsibility.getKimResponsibility();
048                    if(kimResponsibilityImpl==null){
049                            GlobalVariables.getMessageMap().putError(ERROR_PATH, RiceKeyConstants.ERROR_EMPTY_ENTRY, new String[] {"Responsibility"});
050                            return false;
051                    }
052    
053                    IdentityManagementRoleDocument document = (IdentityManagementRoleDocument)addResponsibilityEvent.getDocument();         
054                boolean rulePassed = true;
055                    if (!hasPermissionToGrantResponsibility(ResponsibilityBo.to(kimResponsibilityImpl), document)) {
056                GlobalVariables.getMessageMap().putError(ERROR_PATH, RiceKeyConstants.ERROR_ASSIGN_RESPONSIBILITY, 
057                            new String[] {kimResponsibilityImpl.getNamespaceCode(), kimResponsibilityImpl.getTemplate().getName()});
058                return false;
059                    }
060                    
061                    if (newResponsibility == null || StringUtils.isBlank(newResponsibility.getResponsibilityId())) {
062                rulePassed = false;
063                GlobalVariables.getMessageMap().putError(ERROR_PATH, RiceKeyConstants.ERROR_EMPTY_ENTRY, new String[] {"Responsibility"});
064            } else {
065                    int i = 0;
066                        for (KimDocumentRoleResponsibility responsibility: document.getResponsibilities()) {
067                            if (responsibility.getResponsibilityId().equals(newResponsibility.getResponsibilityId())) {
068                                rulePassed = false;
069                                GlobalVariables.getMessageMap().putError("document.responsibilities["+i+"].responsibilityId", RiceKeyConstants.ERROR_DUPLICATE_ENTRY, new String[] {"Responsibility"});
070                            }
071                            i++;
072                        }
073            }
074                    return rulePassed;
075            } 
076    
077            public boolean hasPermissionToGrantResponsibility(Responsibility kimResponsibilityInfo, IdentityManagementRoleDocument document){
078                    Map<String,String> responsibilityDetails = new HashMap<String,String>();
079                    responsibilityDetails.put(KimConstants.AttributeConstants.NAMESPACE_CODE, kimResponsibilityInfo.getNamespaceCode());
080                    responsibilityDetails.put(KimConstants.AttributeConstants.RESPONSIBILITY_NAME, kimResponsibilityInfo.getName());
081                    if (!getDocumentHelperService().getDocumentAuthorizer(document).isAuthorizedByTemplate(
082                                    document, 
083                                    KimConstants.NAMESPACE_CODE, 
084                                    KimConstants.PermissionTemplateNames.GRANT_RESPONSIBILITY, 
085                                    GlobalVariables.getUserSession().getPerson().getPrincipalId(), 
086                                    responsibilityDetails, null)) {
087                return false;
088                    }
089                    return true;
090            }
091    }