1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.rice.kns.lookup;
17  
18  import org.apache.commons.lang.StringUtils;
19  import org.kuali.rice.core.api.util.RiceKeyConstants;
20  import org.kuali.rice.kim.api.identity.Person;
21  import org.kuali.rice.kim.api.identity.principal.Principal;
22  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
23  import org.kuali.rice.kim.impl.KIMPropertyConstants;
24  import org.kuali.rice.kns.util.FieldUtils;
25  import org.kuali.rice.kns.web.ui.Field;
26  import org.kuali.rice.kns.web.ui.Row;
27  import org.kuali.rice.krad.bo.BusinessObject;
28  import org.kuali.rice.krad.document.authorization.PessimisticLock;
29  import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
30  import org.kuali.rice.krad.service.PessimisticLockService;
31  import org.kuali.rice.krad.util.BeanPropertyComparator;
32  import org.kuali.rice.krad.util.GlobalVariables;
33  import org.kuali.rice.krad.util.KRADConstants;
34  import org.kuali.rice.krad.util.KRADPropertyConstants;
35  import org.kuali.rice.krad.util.ObjectUtils;
36  
37  import java.util.ArrayList;
38  import java.util.Collections;
39  import java.util.Iterator;
40  import java.util.List;
41  import java.util.Map;
42  
43  
44  
45  
46  
47  
48  
49  public class PessimisticLockLookupableHelperServiceImpl extends AbstractLookupableHelperServiceImpl {
50      private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PessimisticLockLookupableHelperServiceImpl.class);
51  
52      private static final long serialVersionUID = -5839142187907211804L;
53      private static final String OWNER_PRINCIPAL_ID_PROPERTY_NAME = "ownedByPrincipalIdentifier";
54      private static final String OWNER_PRINCIPAL_NAME_PROPERTY_NAME = "ownedByUser.principalName";
55  
56      private List<Row> localRows;
57  
58      
59  
60  
61  
62  
63      @Override
64      public List<HtmlData> getCustomActionUrls(BusinessObject businessObject, List pkNames) {
65          PessimisticLock lock = (PessimisticLock)businessObject;
66          if ( (lock.isOwnedByUser(GlobalVariables.getUserSession().getPerson())) || (KRADServiceLocatorWeb
67                  .getPessimisticLockService().isPessimisticLockAdminUser(GlobalVariables.getUserSession().getPerson())) ) {
68              List<HtmlData> anchorHtmlDataList = new ArrayList<HtmlData>();
69              anchorHtmlDataList.add(getUrlData(businessObject, KRADConstants.DELETE_METHOD, pkNames));
70              return anchorHtmlDataList;
71          } else {
72              return super.getEmptyActionUrls();
73          }
74      }
75  
76      
77  
78  
79  
80  
81      @Override
82      public List<Row> getRows() {
83          Person currentUser = GlobalVariables.getUserSession().getPerson();
84          if (KRADServiceLocatorWeb.getPessimisticLockService().isPessimisticLockAdminUser(currentUser)) {
85              return super.getRows();
86          } else {
87              if ( (ObjectUtils.isNull(localRows)) || localRows.isEmpty() ) {
88                  List<Field> fieldList = new ArrayList<Field>();
89                  int numColumns = -1;
90                  
91                  for (Iterator<Row> iterator = super.getRows().iterator(); iterator.hasNext();) {
92                      Row row = (Row) iterator.next();
93                      if (numColumns == -1) {
94                      	numColumns = row.getFields().size();
95                      }
96                      for (Iterator<Field> iterator2 = row.getFields().iterator(); iterator2.hasNext();) {
97                          Field field = (Field) iterator2.next();
98                          if (!(KRADPropertyConstants.OWNED_BY_USER + "." + KIMPropertyConstants.Person.PRINCIPAL_NAME).equals(field.getPropertyName()) &&
99                          		!Field.BLANK_SPACE.equals(field.getFieldType())) {
100                             fieldList.add(field);
101                         }
102                     }
103                 }
104                 
105                 localRows = FieldUtils.wrapFields(fieldList, numColumns);
106             }
107             return localRows;
108         }
109     }
110 
111     
112 
113 
114 
115 
116     @Override
117     public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) {
118         
119         org.kuali.rice.kns.lookup.LookupUtils.removeHiddenCriteriaFields(getBusinessObjectClass(), fieldValues);
120         
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         
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         
144         List searchResults;
145         searchResults = (List) getLookupService().findCollectionBySearchHelper(getBusinessObjectClass(), fieldValues, true);
146         
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 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