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}