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