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}