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