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 * @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