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.kns.lookup; 017 018import org.apache.commons.lang.StringUtils; 019import org.kuali.rice.core.api.util.RiceKeyConstants; 020import org.kuali.rice.kim.api.identity.Person; 021import org.kuali.rice.kim.api.identity.principal.Principal; 022import org.kuali.rice.kim.api.services.KimApiServiceLocator; 023import org.kuali.rice.kim.impl.KIMPropertyConstants; 024import org.kuali.rice.kns.util.FieldUtils; 025import org.kuali.rice.kns.web.ui.Field; 026import org.kuali.rice.kns.web.ui.Row; 027import org.kuali.rice.krad.bo.BusinessObject; 028import org.kuali.rice.krad.document.authorization.PessimisticLock; 029import org.kuali.rice.krad.service.KRADServiceLocatorWeb; 030import org.kuali.rice.krad.service.PessimisticLockService; 031import org.kuali.rice.krad.util.BeanPropertyComparator; 032import org.kuali.rice.krad.util.GlobalVariables; 033import org.kuali.rice.krad.util.KRADConstants; 034import org.kuali.rice.krad.util.KRADPropertyConstants; 035import org.kuali.rice.krad.util.ObjectUtils; 036 037import java.util.ArrayList; 038import java.util.Collections; 039import java.util.Iterator; 040import java.util.List; 041import java.util.Map; 042 043/** 044 * This class is the lookup helper for {@link org.kuali.rice.krad.document.authorization.PessimisticLock} objects 045 * 046 * @author Kuali Rice Team (rice.collab@kuali.org) 047 * 048 * @deprecated Only used by KNS classes, use KRAD. 049 */ 050@Deprecated 051public class PessimisticLockLookupableHelperServiceImpl extends AbstractLookupableHelperServiceImpl { 052 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PessimisticLockLookupableHelperServiceImpl.class); 053 054 private static final long serialVersionUID = -5839142187907211804L; 055 private static final String OWNER_PRINCIPAL_ID_PROPERTY_NAME = "ownedByPrincipalIdentifier"; 056 private static final String OWNER_PRINCIPAL_NAME_PROPERTY_NAME = "ownedByUser.principalName"; 057 058 private List<Row> localRows; 059 060 /** 061 * Hides the applicable links when the PessimisticLock is not owned by the current user 062 * 063 * @see org.kuali.rice.krad.lookup.LookupableHelperService#getCustomActionUrls(org.kuali.rice.krad.bo.BusinessObject, java.util.List, java.util.List pkNames) 064 */ 065 @Override 066 public List<HtmlData> getCustomActionUrls(BusinessObject businessObject, List pkNames) { 067 PessimisticLock lock = (PessimisticLock)businessObject; 068 if ( (lock.isOwnedByUser(GlobalVariables.getUserSession().getPerson())) || (KRADServiceLocatorWeb 069 .getPessimisticLockService().isPessimisticLockAdminUser(GlobalVariables.getUserSession().getPerson())) ) { 070 List<HtmlData> anchorHtmlDataList = new ArrayList<HtmlData>(); 071 anchorHtmlDataList.add(getUrlData(businessObject, KRADConstants.DELETE_METHOD, pkNames)); 072 return anchorHtmlDataList; 073 } else { 074 return super.getEmptyActionUrls(); 075 } 076 } 077 078 /** 079 * This overridden method checks whether the user is an admin user according to {@link PessimisticLockService#isPessimisticLockAdminUser(Person)} and if the user is not an admin user the user field is set to Read Only and the lookup field 080 * 081 * @see org.kuali.rice.krad.lookup.AbstractLookupableHelperServiceImpl#getRows() 082 */ 083 @Override 084 public List<Row> getRows() { 085 Person currentUser = GlobalVariables.getUserSession().getPerson(); 086 if (KRADServiceLocatorWeb.getPessimisticLockService().isPessimisticLockAdminUser(currentUser)) { 087 return super.getRows(); 088 } else { 089 if ( (ObjectUtils.isNull(localRows)) || localRows.isEmpty() ) { 090 List<Field> fieldList = new ArrayList<Field>(); 091 int numColumns = -1; 092 // hide a field and forcibly set a field 093 for (Iterator<Row> iterator = super.getRows().iterator(); iterator.hasNext();) { 094 Row row = (Row) iterator.next(); 095 if (numColumns == -1) { 096 numColumns = row.getFields().size(); 097 } 098 for (Iterator<Field> iterator2 = row.getFields().iterator(); iterator2.hasNext();) { 099 Field field = (Field) iterator2.next(); 100 if (!(KRADPropertyConstants.OWNED_BY_USER + "." + KIMPropertyConstants.Person.PRINCIPAL_NAME).equals(field.getPropertyName()) && 101 !Field.BLANK_SPACE.equals(field.getFieldType())) { 102 fieldList.add(field); 103 } 104 } 105 } 106 // Since the removed field is the first one in the list, use FieldUtils to re-wrap the remaining fields accordingly. 107 localRows = FieldUtils.wrapFields(fieldList, numColumns); 108 } 109 return localRows; 110 } 111 } 112 113 /** 114 * This method implementation is used to search for objects 115 * 116 * @see org.kuali.rice.krad.lookup.AbstractLookupableHelperServiceImpl#getSearchResults(java.util.Map) 117 */ 118 @Override 119 public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) { 120 // remove hidden fields 121 org.kuali.rice.kns.lookup.LookupUtils.removeHiddenCriteriaFields(getBusinessObjectClass(), fieldValues); 122 // force criteria if not admin user 123 Person currentUser = GlobalVariables.getUserSession().getPerson(); 124 if (!KRADServiceLocatorWeb.getPessimisticLockService().isPessimisticLockAdminUser(currentUser)) { 125 fieldValues.put(KRADPropertyConstants.OWNED_BY_PRINCIPAL_ID,GlobalVariables.getUserSession().getPerson().getPrincipalId()); 126 } 127 128 //set owner's principal id and remove owner principal name field 129 String principalName = fieldValues.get(OWNER_PRINCIPAL_NAME_PROPERTY_NAME); 130 if (!StringUtils.isEmpty(principalName)) { 131 Principal principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName(principalName); 132 if (principal != null) { 133 fieldValues.put(OWNER_PRINCIPAL_ID_PROPERTY_NAME, principal.getPrincipalId()); 134 } 135 fieldValues.remove(OWNER_PRINCIPAL_NAME_PROPERTY_NAME); 136 } 137 138 setBackLocation(fieldValues.get(KRADConstants.BACK_LOCATION)); 139 setDocFormKey(fieldValues.get(KRADConstants.DOC_FORM_KEY)); 140 setReferencesToRefresh(fieldValues.get(KRADConstants.REFERENCES_TO_REFRESH)); 141 if (LOG.isInfoEnabled()) { 142 LOG.info("Search Criteria: " + fieldValues); 143 } 144 145 //replace principal name with principal id in fieldValues 146 List searchResults; 147 searchResults = (List) getLookupService().findCollectionBySearchHelper(getBusinessObjectClass(), fieldValues, true); 148 // sort list if default sort column given 149 List defaultSortColumns = getDefaultSortColumns(); 150 if (defaultSortColumns.size() > 0) { 151 Collections.sort(searchResults, new BeanPropertyComparator(getDefaultSortColumns(), true)); 152 } 153 return searchResults; 154 } 155 156 @Override 157 public void validateSearchParameters(Map<String, String> fieldValues) { 158 super.validateSearchParameters(fieldValues); 159 if (StringUtils.isNotEmpty((String)fieldValues.get(OWNER_PRINCIPAL_NAME_PROPERTY_NAME))) { 160 Person person = KimApiServiceLocator.getPersonService().getPersonByPrincipalName((String)fieldValues.get(OWNER_PRINCIPAL_NAME_PROPERTY_NAME)); 161 if (person == null) { 162 String attributeLabel = getDataDictionaryService().getAttributeLabel(getBusinessObjectClass(), OWNER_PRINCIPAL_NAME_PROPERTY_NAME); 163 GlobalVariables.getMessageMap().putError(OWNER_PRINCIPAL_NAME_PROPERTY_NAME, RiceKeyConstants.ERROR_EXISTENCE, attributeLabel); 164 } 165 } 166 } 167 168} 169