001/** 002 * Copyright 2005-2015 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 */ 016package org.kuali.rice.kim.inquiry; 017 018import java.util.ArrayList; 019import java.util.Collections; 020import java.util.HashMap; 021import java.util.List; 022import java.util.Map; 023 024import org.apache.commons.beanutils.PropertyUtils; 025import org.kuali.rice.core.api.criteria.QueryByCriteria; 026import org.kuali.rice.coreservice.impl.namespace.NamespaceBo; 027import org.kuali.rice.kim.api.KimConstants; 028import org.kuali.rice.kim.api.role.Role; 029import org.kuali.rice.kim.api.role.RoleService; 030import org.kuali.rice.kim.api.services.KimApiServiceLocator; 031import org.kuali.rice.kim.impl.permission.PermissionAttributeBo; 032import org.kuali.rice.kim.impl.permission.PermissionBo; 033import org.kuali.rice.kim.impl.permission.UberPermissionBo; 034import org.kuali.rice.kim.impl.role.RoleBo; 035import org.kuali.rice.kim.impl.role.RolePermissionBo; 036import org.kuali.rice.kim.lookup.RoleLookupableHelperServiceImpl; 037import org.kuali.rice.kns.lookup.HtmlData; 038import org.kuali.rice.krad.bo.BusinessObject; 039import org.kuali.rice.krad.data.DataObjectWrapper; 040import org.kuali.rice.krad.data.KradDataServiceLocator; 041import org.kuali.rice.krad.uif.widget.Inquiry; 042import org.kuali.rice.krad.util.KRADPropertyConstants; 043 044/** 045 * This is a description of what this class does - bhargavp don't forget to fill this in. 046 * 047 * @author Kuali Rice Team (rice.collab@kuali.org) 048 * 049 */ 050@SuppressWarnings({"unchecked", "deprecation"}) 051public class PermissionInquirableImpl extends KimInquirableImpl { 052 private static final long serialVersionUID = 1L; 053 054 @Override 055 public void buildInquirableLink(Object dataObject, String propertyName, Inquiry inquiry){ 056 057 if(NAME.equals(propertyName) || NAME_TO_DISPLAY.equals(propertyName)){ 058 Map<String, String> primaryKeys = new HashMap<String, String>(); 059 primaryKeys.put(KimConstants.PrimaryKeyConstants.PERMISSION_ID, KimConstants.PrimaryKeyConstants.PERMISSION_ID); 060 inquiry.buildInquiryLink(dataObject, propertyName, UberPermissionBo.class, primaryKeys); 061 } else if(NAMESPACE_CODE.equals(propertyName) || TEMPLATE_NAMESPACE_CODE.equals(propertyName)){ 062 Map<String, String> primaryKeys = new HashMap<String, String>(); 063 primaryKeys.put(propertyName, "code"); 064 inquiry.buildInquiryLink(dataObject, propertyName, NamespaceBo.class, primaryKeys); 065 } else if(DETAIL_OBJECTS.equals(propertyName)){ 066 super.buildInquirableLink(dataObject, propertyName, inquiry); 067 } else if(ASSIGNED_TO_ROLES.equals(propertyName)){ 068 super.buildInquirableLink(dataObject, propertyName, inquiry); 069 }else{ 070 super.buildInquirableLink(dataObject, propertyName, inquiry); 071 } 072 } 073 074 @Override 075 public HtmlData getInquiryUrl(BusinessObject businessObject, String attributeName, boolean forceInquiry) { 076 /* 077 * - permission detail values (attribute name and value separated by colon, commas between attributes) 078 * - required role qualifiers (attribute name and value separated by colon, commas between attributes) 079 * - list of roles assigned: role type, role namespace, role name 080 */ 081 if(NAME.equals(attributeName) || NAME_TO_DISPLAY.equals(attributeName)){ 082 return getInquiryUrlForPrimaryKeys(UberPermissionBo.class, businessObject, Collections.singletonList(KimConstants.PrimaryKeyConstants.PERMISSION_ID), null); 083 } else if(NAMESPACE_CODE.equals(attributeName) || TEMPLATE_NAMESPACE_CODE.equals(attributeName)){ 084 NamespaceBo parameterNamespace = new NamespaceBo(); 085 String code = (String) KradDataServiceLocator.getDataObjectService().wrap(businessObject).getPropertyValueNullSafe(attributeName); 086 parameterNamespace.setCode(code); 087 return getInquiryUrlForPrimaryKeys(NamespaceBo.class, parameterNamespace, Collections.singletonList(KRADPropertyConstants.CODE), null); 088 } else if(DETAIL_OBJECTS.equals(attributeName)){ 089 //return getAttributesInquiryUrl(businessObject, DETAIL_OBJECTS); 090 } else if(ASSIGNED_TO_ROLES.equals(attributeName)){ 091 return getAssignedRoleInquiryUrl(businessObject); 092 } 093 094 return super.getInquiryUrl(businessObject, attributeName, forceInquiry); 095 } 096 097 protected HtmlData getAttributesInquiryUrl(BusinessObject businessObject, String attributeName){ 098 DataObjectWrapper<BusinessObject> wrapper = KradDataServiceLocator.getDataObjectService().wrap(businessObject); 099 List<PermissionAttributeBo> permissionAttributeData = 100 (List<PermissionAttributeBo>) wrapper.getPropertyValueNullSafe(attributeName); 101 List<HtmlData.AnchorHtmlData> htmlData = new ArrayList<HtmlData.AnchorHtmlData>(); 102 List<String> primaryKeys = new ArrayList<String>(); 103 primaryKeys.add(ATTRIBUTE_DATA_ID); 104 for(PermissionAttributeBo permissionAttributeDataImpl: permissionAttributeData){ 105 htmlData.add(getInquiryUrlForPrimaryKeys(PermissionAttributeBo.class, permissionAttributeDataImpl, primaryKeys, 106 getKimAttributeLabelFromDD(permissionAttributeDataImpl.getKimAttribute().getAttributeName())+ 107 KimConstants.KimUIConstants.NAME_VALUE_SEPARATOR+ 108 permissionAttributeDataImpl.getAttributeValue())); 109 } 110 return new HtmlData.MultipleAnchorHtmlData(htmlData); 111 } 112 113 protected HtmlData getAssignedRoleInquiryUrl(BusinessObject businessObject){ 114 UberPermissionBo permission = (UberPermissionBo)businessObject; 115 List<RoleBo> assignedToRoles = permission.getAssignedToRoles(); 116 List<HtmlData.AnchorHtmlData> htmlData = new ArrayList<HtmlData.AnchorHtmlData>(); 117 if(assignedToRoles!=null && !assignedToRoles.isEmpty()){ 118 RoleService roleService = KimApiServiceLocator.getRoleService(); 119 for(RoleBo roleImpl: assignedToRoles){ 120 Role roleInfo = roleService.getRole(roleImpl.getId()); 121 HtmlData.AnchorHtmlData inquiryHtmlData = getInquiryUrlForPrimaryKeys(RoleBo.class, roleInfo, Collections.singletonList(ID), 122 roleInfo.getNamespaceCode()+ " " + roleInfo.getName()); 123 inquiryHtmlData.setHref(RoleLookupableHelperServiceImpl.getCustomRoleInquiryHref(inquiryHtmlData.getHref())); 124 inquiryHtmlData.setTarget(HtmlData.AnchorHtmlData.TARGET_BLANK); 125 htmlData.add(inquiryHtmlData); 126 } 127 } 128 return new HtmlData.MultipleAnchorHtmlData(htmlData); 129 } 130 131 @Override 132 public Object retrieveDataObject(@SuppressWarnings("rawtypes") Map fieldValues){ 133 if ( fieldValues.get(ID) == null ) { 134 return null; 135 } 136 PermissionBo permissionBo = getDataObjectService().find(PermissionBo.class, fieldValues.get(ID).toString()); 137 return getPermissionsSearchResultsCopy(permissionBo); 138 } 139 140 private PermissionBo getPermissionsSearchResultsCopy(PermissionBo permissionSearchResult){ 141 UberPermissionBo permissionSearchResultCopy = new UberPermissionBo(); 142 try{ 143 PropertyUtils.copyProperties(permissionSearchResultCopy, permissionSearchResult); 144 } catch(Exception ex){ 145 throw new RuntimeException(ex); 146 } 147 List<RolePermissionBo> rolePermissions = getDataObjectService().findMatching(RolePermissionBo.class, QueryByCriteria.Builder.forAttribute("permissionId", permissionSearchResultCopy.getId()).build() ).getResults(); 148 List<RoleBo> assignedToRoles = new ArrayList<RoleBo>(); 149 for(RolePermissionBo rolePermissionImpl: rolePermissions){ 150 if (rolePermissionImpl.isActive()) { 151 assignedToRoles.add( getDataObjectService().find(RoleBo.class, rolePermissionImpl.getRoleId()) ); 152 } 153 } 154 permissionSearchResultCopy.setAssignedToRoles(assignedToRoles); 155 return permissionSearchResultCopy; 156 } 157 158}