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.web.struts.action;
017
018import org.apache.commons.lang.StringUtils;
019import org.apache.log4j.Logger;
020import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
021import org.kuali.rice.core.api.util.RiceKeyConstants;
022import org.kuali.rice.kim.api.identity.principal.Principal;
023import org.kuali.rice.kim.api.services.KimApiServiceLocator;
024import org.kuali.rice.kim.api.type.KimAttributeField;
025import org.kuali.rice.kim.api.type.KimType;
026import org.kuali.rice.kim.bo.ui.KimDocumentRoleMember;
027import org.kuali.rice.kim.bo.ui.KimDocumentRoleQualifier;
028import org.kuali.rice.kim.bo.ui.PersonDocumentRole;
029import org.kuali.rice.kim.document.IdentityManagementPersonDocument;
030import org.kuali.rice.kim.framework.type.KimTypeService;
031import org.kuali.rice.kim.impl.KIMPropertyConstants;
032import org.kuali.rice.kim.impl.type.KimTypeBo;
033import org.kuali.rice.kim.service.KIMServiceLocatorInternal;
034import org.kuali.rice.kim.web.struts.form.IdentityManagementDocumentFormBase;
035import org.kuali.rice.kim.web.struts.form.IdentityManagementPersonDocumentForm;
036import org.kuali.rice.krad.util.GlobalVariables;
037import org.kuali.rice.krad.util.KRADConstants;
038
039import javax.servlet.http.HttpServletRequest;
040import javax.xml.namespace.QName;
041
042/**
043 * This is a description of what this class does - jonathan don't forget to fill this in. 
044 * 
045 * @author Kuali Rice Team (rice.collab@kuali.org)
046 *
047 */
048public class IdentityManagementPersonInquiry extends IdentityManagementBaseInquiryAction {
049    private static final Logger LOG = Logger.getLogger(IdentityManagementPersonInquiry.class);  
050        /**
051         * This overridden method ...
052         * 
053         * @see org.kuali.rice.kim.web.struts.action.IdentityManagementBaseInquiryAction#loadKimObject(javax.servlet.http.HttpServletRequest, org.kuali.rice.kim.web.struts.form.IdentityManagementDocumentFormBase)
054         */
055        @Override
056        protected void loadKimObject(HttpServletRequest request,
057                        IdentityManagementDocumentFormBase form) {
058        IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form;
059        String principalId = request.getParameter(KIMPropertyConstants.Person.PRINCIPAL_ID);
060        String principalName = request.getParameter(KIMPropertyConstants.Person.PRINCIPAL_NAME);
061        if ( StringUtils.isBlank(principalId) && StringUtils.isNotBlank(principalName) ) {
062                Principal principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName(principalName);
063                if ( principal != null ) {
064                        principalId = principal.getPrincipalId();
065                }
066        }
067        if ( principalId != null ) {
068                Principal principal = KimApiServiceLocator.getIdentityService().getPrincipal(principalId);
069                if (principal != null) {
070                        personDocumentForm.setPrincipalId(principalId);
071                        getUiDocumentService().loadEntityToPersonDoc(personDocumentForm.getPersonDocument(), personDocumentForm.getPrincipalId() );
072                    personDocumentForm.setCanOverrideEntityPrivacyPreferences(getUiDocumentService().canOverrideEntityPrivacyPreferences(GlobalVariables.getUserSession().getPrincipalId(), personDocumentForm.getPrincipalId()));
073                        populateRoleInformation( personDocumentForm.getPersonDocument() );
074                } else {
075                        LOG.error("No records found for Person Inquiry.");
076                GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, RiceKeyConstants.ERROR_INQUIRY);
077                }
078        }
079        }
080
081        protected void populateRoleInformation( IdentityManagementPersonDocument personDoc ) {
082                for (PersonDocumentRole role : personDoc.getRoles()) {
083                KimTypeService kimTypeService = (KimTypeService) GlobalResourceLoader.getService(QName.valueOf(
084                    getKimTypeServiceName(KimTypeBo.to(role.getKimRoleType()))));
085                //it is possible that the the kimTypeService is coming from a remote application 
086                // and therefore it can't be guarenteed that it is up and working, so using a try/catch to catch this possibility.
087                try {
088                    role.setDefinitions(kimTypeService.getAttributeDefinitions(role.getKimTypeId()));
089                } catch (Exception ex) {
090                LOG.warn("Not able to retrieve KimTypeService from remote system for KIM Type Id: " + role.getKimTypeId(), ex);
091            }
092                // when post again, it will need this during populate
093            role.setNewRolePrncpl(new KimDocumentRoleMember());
094            for (KimAttributeField key : role.getDefinitions()) {
095                KimDocumentRoleQualifier qualifier = new KimDocumentRoleQualifier();
096                //qualifier.setQualifierKey(key);
097                        setAttrDefnIdForQualifier(qualifier, key);
098                role.getNewRolePrncpl().getQualifiers().add(qualifier);
099            }
100                role.setAttributeEntry( getUiDocumentService().getAttributeEntries( role.getDefinitions() ) );
101                }
102        }
103        
104    private void setAttrDefnIdForQualifier(KimDocumentRoleQualifier qualifier,KimAttributeField definition) {
105                qualifier.setKimAttrDefnId(definition.getId());
106                qualifier.refreshReferenceObject("kimAttribute");
107    }
108        private String getKimTypeServiceName (KimType kimType) {
109        String serviceName = kimType.getServiceName();
110        if (StringUtils.isBlank(serviceName)) {
111                serviceName = "kimTypeService";
112        }
113        return serviceName;
114
115        }
116        
117}