001/** 002 * Copyright 2005-2016 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.impl.type; 017 018import org.apache.commons.lang.StringUtils; 019import org.kuali.rice.core.api.exception.RiceRemoteServiceConnectionException; 020import org.kuali.rice.kew.api.KewApiConstants; 021import org.kuali.rice.kew.doctype.bo.DocumentType; 022import org.kuali.rice.kew.doctype.service.DocumentTypeService; 023import org.kuali.rice.kew.routeheader.service.WorkflowDocumentService; 024import org.kuali.rice.kew.service.KEWServiceLocator; 025import org.kuali.rice.kim.api.KimConstants; 026import org.kuali.rice.kim.api.services.KimApiServiceLocator; 027import org.kuali.rice.kim.api.type.KimType; 028import org.kuali.rice.kim.framework.group.GroupTypeService; 029import org.kuali.rice.kim.framework.role.RoleTypeService; 030import org.kuali.rice.kim.framework.services.KimFrameworkServiceLocator; 031import org.kuali.rice.kim.framework.type.KimTypeService; 032import org.kuali.rice.kim.util.KimCommonUtilsInternal; 033import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl; 034import org.kuali.rice.kns.web.struts.form.LookupForm; 035import org.kuali.rice.krad.bo.BusinessObject; 036import org.kuali.rice.krad.service.KRADServiceLocator; 037import org.kuali.rice.krad.util.KRADConstants; 038import org.kuali.rice.krad.util.UrlFactory; 039import org.springframework.remoting.RemoteAccessException; 040 041import javax.xml.ws.WebServiceException; 042import java.util.ArrayList; 043import java.util.List; 044import java.util.Map; 045import java.util.Properties; 046 047/** 048/** 049 * @author Kuali Rice Team (rice.collab@kuali.org) 050 * 051 */ 052public class KimTypeLookupableHelperServiceImpl extends KualiLookupableHelperServiceImpl { 053 054 private static final long serialVersionUID = 1L; 055 056 @SuppressWarnings("unchecked") 057 @Override 058 protected List<? extends BusinessObject> getSearchResultsHelper(Map<String, String> fieldValues, boolean unbounded) { 059 List<KimTypeBo> searchResults = (List<KimTypeBo>)super.getSearchResultsHelper(fieldValues, unbounded); 060 List<KimTypeBo> filteredSearchResults = new ArrayList<KimTypeBo>(); 061 DocumentTypeService dts = KEWServiceLocator.getDocumentTypeService(); 062 DocumentType st = dts.findByDocumentId(fieldValues.get(KRADConstants.DOC_NUM)); 063 String docName = ""; 064 if (st!=null) { 065 docName = st.getName(); 066 } 067 if(KimConstants.KimUIConstants.KIM_ROLE_DOCUMENT_SHORT_KEY.equals(fieldValues.get(KRADConstants.DOC_FORM_KEY))) { 068 for(KimTypeBo kimTypeBo: searchResults){ 069 if(hasRoleTypeService(KimTypeBo.to(kimTypeBo))) { 070 filteredSearchResults.add(kimTypeBo); 071 } 072 } 073 return filteredSearchResults; 074 } 075 if(KimConstants.KimUIConstants.KIM_GROUP_DOCUMENT_TYPE_NAME.equals(docName)) { 076 for(KimTypeBo kimTypeBo: searchResults){ 077 if(hasGroupTypeService(KimTypeBo.to(kimTypeBo))) { 078 filteredSearchResults.add(kimTypeBo); 079 } 080 } 081 return filteredSearchResults; 082 } 083 return searchResults; 084 } 085 086 @SuppressWarnings("unchecked") 087 @Override 088 protected String getReturnHref(Properties parameters, LookupForm lookupForm, List returnKeys) { 089 KimType kimType = KimApiServiceLocator.getKimTypeInfoService().getKimType(parameters.getProperty(KimConstants.PrimaryKeyConstants.KIM_TYPE_ID)); 090 String href = ""; 091 //TODO: clean this up. 092 boolean showReturnHref = true; 093 boolean refreshMe = false; 094 String docTypeName = ""; 095 String docTypeAction = ""; 096 if(KimConstants.KimUIConstants.KIM_ROLE_DOCUMENT_SHORT_KEY.equals(lookupForm.getFormKey())){ 097 docTypeName = KimConstants.KimUIConstants.KIM_ROLE_DOCUMENT_TYPE_NAME; 098 docTypeAction = KimConstants.KimUIConstants.KIM_ROLE_DOCUMENT_ACTION; 099 // show the create link when there is a type service AND 100 // it has no service (default assignable role) 101 // OR it is not an application role 102 showReturnHref = kimType!=null && 103 ( StringUtils.isBlank( kimType.getServiceName() ) 104 || (KimFrameworkServiceLocator.getKimTypeService(kimType) instanceof RoleTypeService 105 &&!((RoleTypeService) KimFrameworkServiceLocator.getKimTypeService(kimType)).isDerivedRoleType() ) 106 ); 107 } else{ 108 docTypeName = KimConstants.KimUIConstants.KIM_GROUP_DOCUMENT_TYPE_NAME; 109 docTypeAction = KimConstants.KimUIConstants.KIM_GROUP_DOCUMENT_ACTION; 110// showReturnHref = kimType!=null; 111 refreshMe = true; 112 } 113 if(showReturnHref){ 114 if (!refreshMe){ 115 parameters.put(KRADConstants.DISPATCH_REQUEST_PARAMETER, KRADConstants.DOC_HANDLER_METHOD); 116 parameters.put(KRADConstants.PARAMETER_COMMAND, KewApiConstants.INITIATE_COMMAND); 117 parameters.put(KRADConstants.DOCUMENT_TYPE_NAME, docTypeName); 118 if (StringUtils.isNotBlank(getReturnLocation())) { 119 parameters.put(KRADConstants.RETURN_LOCATION_PARAMETER, getReturnLocation()); 120 } 121 } 122 href = UrlFactory.parameterizeUrl(KimCommonUtilsInternal.getKimBasePath()+docTypeAction, parameters); 123 } 124 return href; 125 } 126 127 public static boolean hasRoleTypeService(KimType kimType){ 128 return (kimType!=null && kimType.getServiceName()==null) || 129 (KimFrameworkServiceLocator.getKimTypeService(kimType) instanceof RoleTypeService); 130 } 131 132 public static boolean hasRoleTypeService(KimType kimType, KimTypeService kimTypeService){ 133 return (kimType!=null && kimType.getServiceName()==null) || 134 (kimTypeService instanceof RoleTypeService); 135 } 136 137 public static boolean hasGroupTypeService(KimType kimType){ 138 return (kimType!=null && kimType.getServiceName()==null) || 139 (KimFrameworkServiceLocator.getKimTypeService(kimType) instanceof GroupTypeService); 140 } 141 142 public static boolean hasDerivedRoleTypeService(KimType kimType){ 143 boolean hasDerivedRoleTypeService = false; 144 KimTypeService kimTypeService = KimFrameworkServiceLocator.getKimTypeService(kimType); 145 //it is possible that the the roleTypeService is coming from a remote application 146 // and therefore it can't be guaranteed that it is up and working, so using a try/catch to catch this possibility. 147 try { 148 if(hasRoleTypeService(kimType, kimTypeService)) { 149 hasDerivedRoleTypeService = (kimType.getServiceName()!=null && ((RoleTypeService)kimTypeService).isDerivedRoleType()); 150 } 151 } catch (RiceRemoteServiceConnectionException ex) { 152 LOG.warn("Not able to retrieve KimTypeService from remote system for KIM Type: " + kimType.getName(), ex); 153 } 154 // KULRICE-4403: catch org.springframework.remoting.RemoteAccessException 155 catch (RemoteAccessException rae) { 156 LOG.warn("Not able to retrieve KimTypeService from remote system for KIM Type: " + kimType.getName(), rae); 157 } catch (WebServiceException e) { 158 LOG.warn("Not able to retrieve KimTypeService from remote system for KIM Type: " + kimType.getName(), e); 159 } 160 return hasDerivedRoleTypeService; 161 } 162 163}