001 /**
002 * Copyright 2005-2014 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.kim.api.cache;
017
018 import org.apache.commons.collections.CollectionUtils;
019 import org.apache.commons.lang.StringUtils;
020 import org.kuali.rice.kim.api.permission.Permission;
021 import org.kuali.rice.kim.api.permission.PermissionService;
022 import org.kuali.rice.kim.api.responsibility.Responsibility;
023 import org.kuali.rice.kim.api.responsibility.ResponsibilityService;
024 import org.kuali.rice.kim.api.role.RoleService;
025 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
026
027 import java.util.ArrayList;
028 import java.util.Collections;
029 import java.util.List;
030
031
032 public final class KimCacheUtils {
033
034 private KimCacheUtils() {
035 throw new UnsupportedOperationException();
036 }
037
038 /**
039 * Used for a caching condition to determine if a role passed to a method is derived or not.
040 *
041 * @param roleIds list of role id values
042 *
043 * @return true if list contains a derived role.
044 */
045 public static boolean isDynamicRoleMembership(List<String> roleIds) {
046 if (CollectionUtils.isEmpty(roleIds)) {
047 return false;
048 }
049 RoleService roleService = KimApiServiceLocator.getRoleService();
050 for (String roleId : roleIds) {
051 if (roleService.isDynamicRoleMembership(roleId)) {
052 return true;
053 }
054 }
055 return false;
056 }
057
058 /**
059 * Used for a caching condition to determine if a role passed to a method is derived or not.
060 *
061 * @param namespaceCode namespaceCode of role
062 * @param roleName name of role
063 *
064 * @return true if list contains role.
065 */
066 public static boolean isDynamicMembshipRoleByNamespaceAndName(String namespaceCode, String roleName) {
067 List<String> roleIds = Collections.singletonList(
068 KimApiServiceLocator.getRoleService().getRoleIdByNamespaceCodeAndName(namespaceCode, roleName));
069 return isDynamicRoleMembership(roleIds);
070 }
071
072 /**
073 * Used for a caching condition to determine if a responsibility is assigned to a derived role.
074 *
075 * @param responsibilityId id of responsibility
076 *
077 * @return true if assigned to a derived role.
078 */
079 public static boolean isResponsibilityIdAssignedToDynamicRole(String responsibilityId) {
080 if ( StringUtils.isBlank(responsibilityId)) {
081 return false;
082 }
083
084 List<String> roleIds = KimApiServiceLocator.getResponsibilityService().getRoleIdsForResponsibility(responsibilityId);
085 return isDynamicRoleMembership(roleIds);
086 }
087
088 /**
089 * Used for a caching condition to determine if a responsibility is assigned to a derived role.
090 *
091 * @param namespaceCode namespaceCode of responsibility
092 * @param responsibilityName name of responsibility
093 *
094 * @return true if assigned to a derived role.
095 */
096 public static boolean isResponsibilityAssignedToDynamicRole(String namespaceCode, String responsibilityName) {
097 if (StringUtils.isBlank(namespaceCode) || StringUtils.isBlank(responsibilityName)) {
098 return false;
099 }
100 Responsibility responsibility = KimApiServiceLocator.getResponsibilityService().findRespByNamespaceCodeAndName(namespaceCode, responsibilityName);
101
102 if (responsibility != null) {
103 return isResponsibilityIdAssignedToDynamicRole(responsibility.getId());
104 }
105 return false;
106 }
107
108 /**
109 * Used for a caching condition to determine if a responsibility template is assigned to a derived role.
110 *
111 * @param namespaceCode namespaceCode of permission
112 * @param responsibilityTemplateName name of responsibility template
113 *
114 * @return true if assigned to a derived role.
115 */
116 public static boolean isResponsibilityTemplateAssignedToDynamicRole(String namespaceCode,
117 String responsibilityTemplateName) {
118 if (StringUtils.isBlank(namespaceCode) || StringUtils.isBlank(responsibilityTemplateName)) {
119 return false;
120 }
121 ResponsibilityService respService = KimApiServiceLocator.getResponsibilityService();
122 List<Responsibility> responsibilities = KimApiServiceLocator.getResponsibilityService().findResponsibilitiesByTemplate(namespaceCode, responsibilityTemplateName);
123 List<String> roleIds = new ArrayList<String>();
124 for (Responsibility resp : responsibilities) {
125 roleIds.addAll(respService.getRoleIdsForResponsibility(resp.getId()));
126 }
127
128 return isDynamicRoleMembership(roleIds);
129 }
130
131 }